如何使用BASH删除配置文件中含New的完整条目区块?
BASH删除配置文件中指定关键字的完整区块并直接更新原文件
问题场景
有如下结构的配置文件(test.txt),需要删除以New {开头的整个区块及其所有关联内容,且不想生成冗余临时文件,直接更新原文件:
Test { blah.. site { id } location { id } staff { access { } } } New { blah.. site { id } location { id } staff { access { } } } Link { blah.. site { id } location { id } staff { access { } } }
期望处理后移除New区块,保留其余内容。
解决方案
方法1:通用awk方案(兼容所有环境)
用awk基于大括号层级精准匹配区块,通过临时文件替换原文件,执行后临时文件会被自动清理,无冗余残留:
awk '/^New {/{skip=1; brace=1} skip{brace+=gsub(/\{/,"")-gsub(/\}/,""); if(brace==0) skip=0; next} 1' test.txt > temp.txt && mv temp.txt test.txt
逻辑说明:
- 匹配到
^New {行时,开启跳过标记skip,并初始化大括号计数brace=1 - 处于跳过状态时,统计每行的大括号数量(
{加1,}减1),当brace归0时,说明区块结束,关闭跳过标记 - 未被跳过的行正常输出(
1代表打印当前行)
方法2:GNU awk原地编辑(无需临时文件)
如果系统安装了GNU awk(Linux默认是GNU awk),可以用其内置的inplace选项直接修改原文件,完全不需要临时文件:
gawk -i inplace '/^New {/{skip=1; brace=1} skip{brace+=gsub(/\{/,"")-gsub(/\}/,""); if(brace==0) skip=0; next} 1' test.txt
为什么不推荐原grep方案?
原方案用grep -A25硬编码行数,一旦New区块的内容行数变化(比如新增/删除子项),就会出现匹配不全或误删其他内容的问题;而awk方案基于大括号层级匹配,不管区块长度如何变化,都能精准定位整个区块。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

