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

如何用sed提取嵌套标记间文本?现有双sed方案能否优化?

用单次sed命令提取目标文本

针对你给出的输入内容:

something

START MARKER
foo
I
just
want
this
foo
END MARKER

something else

foo
I don't want this
foo

可以用单次sed命令实现需求,无需两次管道调用,命令如下:

sed -n '
/START MARKER/,/END MARKER/ {
  # 跳过START和END标记行本身
  /START MARKER\|END MARKER/ !{
    # 当遇到foo时进入循环处理
    /foo/ {
      :loop
      # 读取下一行
      n
      # 如果不是foo行就打印,然后回到循环继续处理
      /foo/ !{
        p
        b loop
      }
    }
  }
}' input

命令逻辑说明

  1. -n 参数关闭默认打印行为,只输出我们指定的内容
  2. /START MARKER/,/END MARKER/ { ... } 限定只处理两个标记之间的行
  3. /START MARKER\|END MARKER/ ! 排除掉START和END标记行本身
  4. 遇到foo行后,进入循环:读取下一行,若该行不是foo则打印,直到再次遇到foo时退出循环,精准提取两段foo之间的目标文本

如果追求更紧凑的写法,也可以把命令压缩成一行:

sed -n '/START MARKER/,/END MARKER/{/foo/{:a;n;/foo/!{p;ba}}}' input

执行后会输出:

I
just
want
this

内容的提问来源于stack exchange,提问作者Xophmeister

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 06:23:22