アッ

アッ

似ていますが、まったく同じではありません。2つのパターン(含む)の間で最初の発生を選択する方法...次の入力ファイルが提供されます。

something P1 something
content1
content2
something P1 something
content3
content4

次の出力が必要です。

something P1 something
content1
content2

答え1

奇妙な解決策:

 awk '/^something P1 something$/{if(++i>1)exit} i' input_file

これにより、一致する最初の行/^something P1 something$/とパターンに一致する次の行(該当する行は含まれません)またはファイルの終わりまでのすべての行が印刷されます。

答え2

私はこれがあなたが本当に欲しいものだと思います。

最初のブロックを印刷します。

$ awk '$0=="something P1 something"{c++} c==1' file
something P1 something
content1
content2

または、2番目のものを印刷します。

$ awk '$0=="something P1 something"{c++} c==2' file
something P1 something
content3
content4

など。明示的な要件がない場合、これは単なる推測です。

答え3

 $ sed -ne '
     /P1/!d
     :loop
        p;n
     //!bloop
     q
 ' file 

結果:

something P1 something1
content1
content2

Posix以外の構文でGnu sedエディタを使用するQ:

$ sed -e '
   /P1/,/P1/!d
   //!{$q;b;}
   G;/\n./Q;s/\n.*//;h
' file

Posix 専用設定の場合は、次の操作を行います。

 $ sed -ne '
      /P1/,/P1/!d
      //!{
        p;$q;d
      }
      G;/\n./q;s/\n.*//p;h
 ' file

パールの使用:

$ perl -lne '
    next unless $e = /P1/ ... /P1/;
    $e =~ /E/ ? last : print;
' file

その後、次のようになります。

$ perl -0777 -pe '$_ = /^(.*?P1(?s:.*?\n))(?=.*?P1)/m ? $1 : $,' file

答え4

アッ

iパターンの一般的な解決策詰まったawkでは次のようになります。

awk -v i=1 -v pat='something P1 something'    '$0~pat{i--}i==0'

説明する:

-v i=1        # sets the pattern block to print (1 in this case).
-v pat='...'  # sets the regex pattern that will be tested.

$0~pat        # tests if the input line match the pattern
{i--}         # If the pattern was found, reduce the count.
i==0          # If the count has reduced to 0, print the block lines.

重要モードがP1の場合は、次を使用します。

awk -v i=1 -v pat='P1' '$0~pat{i--}i==0'

より速く実行するには、ブロックの最後で終了してください。

awk -v i=1 -v pat='P1' '$0~pat{i--}i==0;i<0{exit}'

ひとりが欲しいなら言葉(パターンではありません)一致させるには、次のようにします。

awk -v i=1 -v pat='P1' '$0 == pat {i--}; i==0; i<0{exit}'

sed

~から始める最初パターンの1つのインスタンスから次のインスタンスにGNU sedで次のことができます。

sed -n '/something P1 something/!b;b2;:1;{/something P1 something/q;:2;p;n;b1}'

最初の行の前に数行があるかもしれませんsomething P1 something
2番目のパターンが見つかると、スクリプトは(高速)停止します。

両方のモード(開始と終了)が同じであるため、次のようにコマンドを単純化できます。

sed -n -e '/something P1 something/!b;b2;:1;{//q;:2;p;n;b1}'

移植性を高めるには、次のようにします。

sed -n -e '/something P1 something/!{b' -e '};b2' -e ':1' -e '{//q;:2' -e 'p;n;b1' -e '}'

関連情報