如何使用sed命令移除匹配字符串至下一个匹配项间的内容
解决方法
要实现从content.txt中删除test.txt列出的每个区块(从[关键词]行到下一个[xxx]行之前的所有内容),可以用sed结合awk动态生成删除规则,具体步骤如下:
核心思路
- 从
test.txt读取每个关键词,转换成sed能识别的区块删除规则——匹配到[关键词]行后,持续读取后续内容直到遇到下一个[开头的区块行,然后删除整个目标区块(保留下一个区块的起始行)。 - 用进程替换临时生成
sed脚本,避免创建中间文件。
执行命令
直接运行这条命令即可得到处理后的内容:
sed -f <(awk '{printf "/\\[%s\\]/ { :a; N; /\\n\\[/!ba; s/.*\\n// }\n", $0}' test.txt) content.txt
如果需要直接修改content.txt文件(注意:修改前建议备份原文件),可以添加-i参数:
sed -i -f <(awk '{printf "/\\[%s\\]/ { :a; N; /\\n\\[/!ba; s/.*\\n// }\n", $0}' test.txt) content.txt
命令解释
awk部分:遍历test.txt的每一行,生成对应的sed规则。比如对于testing1,生成的规则是:/\[testing1\]/ { :a; N; /\n\[/!ba; s/.*\n// }这个规则的作用是:
- 匹配到
[testing1]行时进入块处理; :a定义循环标签,N读取下一行到当前模式空间;/\n\[/!ba检查是否读取到了下一个区块的起始行(以\n[开头),如果没读到就回到标签a继续读取;- 一旦匹配到下一个区块行,用
s/.*\n//删除从目标区块起始行到下一个区块行之前的所有内容,只保留下一个区块的起始行。
- 匹配到
sed -f <(...):通过进程替换把awk生成的脚本直接传给sed执行,不用创建临时脚本文件。
验证结果
用你的示例文件测试,执行命令后输出应该是:
[testing] This is testing I want to remove content [source] This is the source file it contains data related to source file
内容的提问来源于stack exchange,提问作者Sai
相关产品推荐
相关产品推荐

