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

如何使用sed命令移除匹配字符串至下一个匹配项间的内容

解决方法

要实现从content.txt中删除test.txt列出的每个区块(从[关键词]行到下一个[xxx]行之前的所有内容),可以用sed结合awk动态生成删除规则,具体步骤如下:

核心思路

  1. 从test.txt读取每个关键词,转换成sed能识别的区块删除规则——匹配到[关键词]行后,持续读取后续内容直到遇到下一个[开头的区块行,然后删除整个目标区块(保留下一个区块的起始行)。
  2. 用进程替换临时生成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// }
    

    这个规则的作用是:

    1. 匹配到[testing1]行时进入块处理;
    2. :a定义循环标签,N读取下一行到当前模式空间;
    3. /\n\[/!ba检查是否读取到了下一个区块的起始行(以\n[开头),如果没读到就回到标签a继续读取;
    4. 一旦匹配到下一个区块行,用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:20:20