私はsedを使用して2つの異なるパターン間の行を返します[(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を使用すると、^
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
し、存在しない場合はグループとグループの最後の行番号を印刷します。