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
相关产品推荐
相关产品推荐

