我正在使用 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
,如果不存在,则打印该组和该组的最后一个行号。