You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并两个awk命令以交换配置文件中的指定配置块顺序?

合并Awk命令交换两个配置块顺序

完全可以将两个Awk命令合并成一个,一次性完成两个配置块的顺序交换。下面是实现脚本和说明:

实现脚本

/^\[code\.(change|test)\..*\]/ {
    if ($0 ~ /change/) {
        change_title = $0
        in_change = 1
    } else {
        test_title = $0
        in_test = 1
    }
    next
}
in_change && NF {
    change_content = change_content $0 "\n"
    next
}
in_change && !NF {
    in_change = 0
}
in_test && NF {
    test_content = test_content $0 "\n"
    next
}
in_test && !NF {
    in_test = 0
}
END {
    print test_title
    printf "%s", test_content
    print ""
    print change_title
    printf "%s", change_content
}

使用方式:

awk -f swap_blocks.awk file.cfg

或者直接单行执行:

awk '/^\[code\.(change|test)\..*\]/ {if ($0 ~ /change/) {change_title=$0; in_change=1} else {test_title=$0; in_test=1}; next} in_change && NF {change_content=change_content $0 "\n"; next} in_change && !NF {in_change=0} in_test && NF {test_content=test_content $0 "\n"; next} in_test && !NF {in_test=0} END {print test_title; printf "%s", test_content; print ""; print change_title; printf "%s", change_content}' file.cfg

工作原理

  1. 捕获块标题:匹配[code.change.*]或[code.test.*]格式的标题行,分别保存标题文本并标记进入对应块的状态
  2. 收集块内容:在对应块的激活状态下,将非空行内容追加到对应变量中,遇到空行时退出该块的捕获状态
  3. 交换输出:处理完所有行后,先输出test块的标题和内容,再输出change块的标题和内容,保持块内结构不变

示例效果

输入(file.cfg)

[code.change.1]
file.path=filename
file.contact=manager
file.active=TRUE

[code.test.1]
ls -la filepath
pwd
find . -name filename

输出

[code.test.1]
ls -la filepath
pwd
find . -name filename

[code.change.1]
file.path=filename
file.contact=manager
file.active=TRUE

内容的提问来源于stack exchange,提问作者Pink Ninja

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 23:41:06