特定の複数行パターンから最後までファイルの内容を表示します。

特定の複数行パターンから最後までファイルの内容を表示します。

複数行モードで最後までファイルの内容を表示する方法パターン自体を含む

しばらく前に同様の質問をしましたが、内容が違うので、別の新しい質問に載せてみようかと思っています。だから、単にそれのためにこの重複項目を表示しないでください!

たとえば、次のテキストファイルがあるとします。

cat
dog
fox
cow
dove
bird
bunny
gnu
hen
dove
bird
buffalo

私のスキーマが次のような場合:

dove
bird
bunny

私が得たいものは:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

私の実際のファイルはかなり大きいので、これを達成する方法が複数ある場合は、より速い方法を好みます。

答え1

パターンが最初に表示されてから印刷を開始するのは簡単です。私が説明したのと同じ論理に従ってもう一つの答えしかし、いくつかの追加のロジックがあります。

解析.sed

/^dove$/ {            # Match multi-line pattern
  N                   #  /
  N                   # /
  /\nbird\nbunny$/bb  # When matched jump to label b
}
d                     # Restart with next line if no match
:b                    # \
n                     #  Print the rest of the file
bb                    # /

次のように実行します。

sed -f parse.sed infile

またはポータブルシングルライナーで:

sed -n -e '/^dove$/{N;N;/\nbird\nbunny$/bb' -e '};d;:b' -e 'p;n;bb' infile

どちらの場合も出力:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

答え2

Perlソリューションは次のとおりです。

perl -0777 -ne 'print $1,$2 if m/(dove.bird.bunny)(.*)/sm' myfile

この出力は次のようになります。

dove
bird
bunny
gnu
hen
dove
bird
buffalo

-0777オン喫煙ファイル全体をメモリに読み込むモードです。sm一致修飾子を使用すると、文字列を複数行として処理しながら点一致の改行が可能になります。

この-nスイッチは入力ファイルの読み取りループを生成します。順序があるとき鳩に縛られたウサギ$1見て、残りの行でキャプチャされ、完全$2一致が成功したときに印刷される内容です。

答え3

アッ解決策:

awk -v RS=" " '{                        # considering space as record separator
                  for(i=1;i<=NF;i++) {  # iterating through all fields
                     if ($i=="dove" && $(i+1)=="bird" && $(i+2)=="bunny") { f=1 } 
                     if (f) print $i 
                  } 
               }' file

出力:

dove
bird
bunny
gnu
hen
dove
bird
buffalo

関連情報