複数行 awk 正規表現

複数行 awk 正規表現

text.txt以下を考慮してください。

blablabla    
&&&key word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as output
&&&key word&&&
blablabla

awk次の出力を得る正規表現を実装したいと思います。

I want all 
these text and numbers 123
and chars !"£$%&
as output

私は次の表現を使用しています。

awk "$1 ~ /^[&&&key word&&&].[&&&key word&&&]/" test.txt

しかし、結果は私が期待したものとは異なります。

&&&key word&&&
&&&key word&&&

おそらく良い質問ではないかもしれないので申し訳ありません。ここで多くの解決策を試してみましたが、stackoverflowもいくつかのチュートリアルを読みましたが、それでも解決できません。このトピックに関する完全なチュートリアルも提供していただきありがとうございます。

編集:提案されているように$ 0を使用すると、より良い結果が得られます。

awk "$0 ~ /[&&&key word&&&]/,/[&&&key word&&&]/" test.txt

結果:

&&&key word&&&
I want all 
these text and numbers 123
and chars !"£$%&
as result
&&&key word&&&

それでも最初の行と最後の行を削除する必要があります。条件が似ているかどうかはわかりますが、上記のawk "{if (NR!=1&&NR!=-1) {print}}" text.txt出力に適用する方法がわかりません。

ベストアンサー1

awk 'BEGIN {p=0}; /&&&key word&&&/ { p = ! p ; next } ; p { print }' file

これは、一致する2つのインスタンス間の行のみを印刷します&&&key word&&&。この変数は、p印刷するかどうかを決定するフラグとして使用されます。 falseで始まり(印刷しない)、&&&key word&&&入力行に一致する項目があるたびに論理的に否定(反転)されます。

入力行ブロックが複数ある場合、&&&key word&&&そのブロックはすべて印刷されます(他のブロックは印刷されません)。一致する先頭がありますが、&&&key word&&&終了がない場合は、ファイルの終わりまでのすべての後続の行が印刷されます。

出力:

I want all 
these text and numbers 123
and chars !"£$%&
as output

開始キーワードと終了キーワードが異なる場合(例:「START」や「STOP」)、次のようにできます。

awk 'BEGIN {p=0};
     /START/ { p = 1 ; next };
     /STOP/ { p = 0 ; next};
     p { print }' file

おすすめ記事