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