一致するすべての行とインデントされていない前の行を印刷します。

一致するすべての行とインデントされていない前の行を印刷します。

たとえば、テキストに「一致」があるすべての行と、以前にインデントされていない行を探したいとします。

Container 1
   some text
   some text
   matching text
   some text
Container 2
   some text
   some text
Container 3
   some text
   matching text

私が望む結果は次のとおりです。

Container 1
   matching text
Container 3
   matching text

可能ですか?

ベストアンサー1

1つの方法は次のとおりですsed

sed -n '/^[^[:blank:]]/b do      # if line is not indented go to label do
//!{                             # if line is indented and if it
/matching/H                      # matches, append it to hold space
}
$b do                            # if on last line go to label do
b                                # branch to end of script
: do                             # label do
x                                # exchange hold buffer w. pattern space
/\n.*matching/p                  # if current pattern space matches, print
' infile

インデントされていない一致行も印刷する場合(たとえば、Container matching stuff次のインデントブロックに一致する行がない場合など)、最後の条件を変更して制限を/matching/p削除\n.*し、1行だけ残ってもパターンスペースを印刷します(インデントなし)。 )マッチ:

sed -n '/^[^[:blank:]]/b do
//!{
/matching/H
}
$b do
b
: do
x
/matching/p
' infile

おすすめ記事