複数行モードで最後までファイルの内容を表示する方法パターン自体を含む?
しばらく前に同様の質問をしましたが、内容が違うので、別の新しい質問に載せてみようかと思っています。だから、単にそれのためにこの重複項目を表示しないでください!
たとえば、次のテキストファイルがあるとします。
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