現在の行からパターンに一致しない行まで一致します

現在の行からパターンに一致しない行まで一致します

本当に検索してみましたが、何も見つかりませんでした (何を検索すればよいのか正確にはわかりません)。

私はこれを次のように行う方法を知っていますsed: 現在の行から何かに一致する行まで印刷します:

sed -n '/1/,/SOMETHING/p'

しかし、同じことを現在の行から次の行まで印刷するにはどうすればいいでしょうか?ではない何かと一致しますか?

例えば、これを次のようにパイプしますsed:

blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah
NO MATCH HERE

次に、最初の 3 行だけをフィルタリングして印刷します (ただし、「3」は変化する可能性があります)。

答え1

これはあなたが本当に望んでいるほど一般的なものではないかもしれませんが、出発点は次のとおりです。

 sed -n '/SOMETHING/!q;p'

これは、 に一致するかどうかを確認します/SOMETHING/。行一致しない(!テストの結果を反転するために を使用)、終了します。それ以外の場合は、この行を出力し、次の行に進みます。

これは、要求した操作とファイルに対するその他の操作をすべて同じsedコマンドで実行できるほど柔軟ではありません。

答え2

次のループを試すことができますsed:

$ sed -n '{:loop p; n; /SOMETHING/b loop; q}' test.txt 
blah blah SOMETHING blah blah
blah blah SOMETHINGblahblahblah
SOMETHING blah blah

これ:

  • :loopというラベルを作成しますloop
  • p現在の行を印刷します
  • n次の行を取得します
  • /SOMETHING/b looploop行が一致する場合に分岐する/SOMETHING/
  • q分岐が発生しない場合。

いずれにしても、1 行が出力されます。(おそらく G-Man の回答で修正できます。)

出典:このSOの質問

関連情報