如何用sed提取嵌套标记间文本?现有双sed方案能否优化?
用单次sed命令提取目标文本
针对你给出的输入内容:
something
START MARKER
foo
I
just
want
this
foo
END MARKERsomething 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
命令逻辑说明
-n参数关闭默认打印行为,只输出我们指定的内容/START MARKER/,/END MARKER/ { ... }限定只处理两个标记之间的行/START MARKER\|END MARKER/ !排除掉START和END标记行本身- 遇到
foo行后,进入循环:读取下一行,若该行不是foo则打印,直到再次遇到foo时退出循环,精准提取两段foo之间的目标文本
如果追求更紧凑的写法,也可以把命令压缩成一行:
sed -n '/START MARKER/,/END MARKER/{/foo/{:a;n;/foo/!{p;ba}}}' input
执行后会输出:
I just want this
内容的提问来源于stack exchange,提问作者Xophmeister
相关产品推荐
相关产品推荐

