在每个 sed 匹配上分开

在每个 sed 匹配上分开

我正在使用 sed 返回两个不同模式之间的行[(1) <Directory>, (2) </Directory>]。对于给定的输入文件,sed 有多个匹配项,我想知道是否可以通过管道传输每个单独的匹配项。

我基本上想做的是: sed -n "/ddd/,/</ddd>p" < input.conf | grep Options

...
ddd    Start of Match group #1
eee
fff
/ddd   End of Match group #1
...
ddd    Start of Match group #2
iii
yyy
/ddd   End of Match group #2

我想检查每个匹配组是否包含模式 fff。

答案1

考虑到复杂的需求,awk 更适合解决这个问题。

与 sed 从头到尾打印等效的是(在 awk 中):

$ awk '/^ddd/{p=1};p;/^[/]ddd/{p=0}' file
ddd    Start of Match group #1
eee
fff
/ddd   End of Match group #1
ddd    Start of Match group #2
iii
yyy
/ddd   End of Match group #2

使用 可以^确保 amtch 位于行的开头,并且[\]只匹配\行开头的 a。

切换测试,我们可以删除起始行和结束行:

$ awk '/^[/]ddd/{p=0};p;/^ddd/{p=1}' file
eee
fff
iii
yyy

剩下要测试的就是(在一个范围内)是否有任何带有 的行fff。这可以通过以下方式完成:

awk ' /^[/]ddd/{p=0;if(found==0){print NR};found=0};
      p&&($0~/fff/){found=1};
      /^ddd/{p=1}
    ' file

这将打印不包含在其中的组的最后一行的行号(NR)fff

答案2

尝试

sed -n '/ddd/ {:L; N; /\/ddd/!bL; /fff/ !{p; =;} }' file

当遇到 时ddd,它会收集模式空间中的行/ddd,然后进行测试fff,如果不存在,则打印该组和该组的最后一个行号。

相关内容