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

sed正则匹配输出多余行,如何正确提取带缩进的---分隔块内容

问题原因分析
  • N命令的执行逻辑问题:你在sed脚本开头加了N,会让sed每次读取两行内容拼入模式空间(两行之间保留换行符)再进行正则匹配。当sed处理到第二个---所在行时,会把下一行的123也拉入模式空间,此时模式空间的内容是---\n123。
  • sed地址区间的打印规则:sed的范围匹配/start/,/end/会把从匹配start开始,到匹配end为止的所有模式空间内容全部打印。此时模式空间包含---和123,所以会被一起输出,这就是多余123出现的原因。
  • 你原有正则匹配第一个---后4个空格的逻辑是正确的,\s{5}刚好匹配两行拼接后的1个换行符+4个空格,符合你的匹配要求,只是N的用法引入了副作用。
解决方法

方案1:逐行处理(更稳妥,无多余行问题)

不需要用N命令,直接逐行匹配,同时强制校验第一个---后的行必须是4个空格缩进,命令如下:

sed -n '/^---$/{
  n
  /^    /!q
  :loop
  p
  n
  /^---$/q
  b loop
}' t

执行后输出结果完全符合要求:

abc
def DEF    
ghi GHI

如果你需要连边界的---也一起输出,调整命令如下即可:

sed -n '/^---$/{
  p
  n
  /^    /!q
  :loop
  p
  n
  /^---$/{p;q}
  b loop
}' t

方案2:调整原有N命令的写法

如果要保留你原有正则的匹配逻辑,只需要在匹配到结束边界时,只打印第一行的---,丢弃后面拉入的多余内容即可:

sed -En '{N; /^---\s{5}\w+/,/^---/{/^---\n/!p; /^---\n[^\n]*$/{s/\n.*//p;q}}}' t

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 00:57:04