如何用sed命令删除含q-third-party的[A8-LINER-ADJUSTEMENT]区块?
解决Sed删除包含指定内容的完整配置区块问题
问题场景
现有文件introduction-availe.dat包含注释段落,以及多个以[A8-LINER-ADJUSTEMENT]开头、空行结尾的配置区块。需要完整删除所有包含type: q-third-party属性的配置区块(包括区块开头的[A8-LINER-ADJUSTEMENT]行和结尾的空行)。之前执行的命令仅删除了type: q-third-party这一行,未实现删除整个区块的目标。
正确Sed命令及解释
方法一:利用临时存储区暂存区块内容
sed -i '/\[A8-LINER-ADJUSTEMENT\]/,/^$/ { H; /^$/ { x; /q-third-party/d; } }' introduction-availe.dat
命令逻辑:
- 用
/\[A8-LINER-ADJUSTEMENT\]/,/^$/定位从区块开头到结尾空行的完整范围 H将当前行追加到sed的临时存储区(hold空间),逐步攒起整个区块的内容- 当匹配到区块结尾的空行时,通过
x把临时存储区的内容交换到模式空间,检查是否包含q-third-party:如果包含,直接删除模式空间的所有内容(即整个区块);如果不包含,内容会自动输出,保留原区块
方法二:一次性读取整个区块再判断
sed -i '/\[A8-LINER-ADJUSTEMENT\]/ { :loop; N; /\n$/!b loop; /q-third-party/d; }' introduction-availe.dat
命令逻辑:
- 匹配到区块开头行时,进入自定义标签
loop N读取下一行并追加到模式空间,直到模式空间末尾是换行符(也就是读到了区块结尾的空行)- 此时模式空间里是整个区块的内容,检查是否包含
q-third-party:如果包含则删除整个区块,否则保留输出
内容的提问来源于stack exchange,提问作者Kotkoroid
相关产品推荐
相关产品推荐

