如何合并两个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
工作原理
- 捕获块标题:匹配
[code.change.*]或[code.test.*]格式的标题行,分别保存标题文本并标记进入对应块的状态 - 收集块内容:在对应块的激活状态下,将非空行内容追加到对应变量中,遇到空行时退出该块的捕获状态
- 交换输出:处理完所有行后,先输出
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
相关产品推荐
相关产品推荐

