パターンの最初の発生と最後の発生の間のすべての行をどのように取得できますか?

パターンの最初の発生と最後の発生の間のすべての行をどのように取得できますか?

fooパターンの最初の発生からパターンの最後の発生までの行だけを取得するようにファイル(入力ストリーム)をどのように切り捨てますかbar

たとえば、次の入力を考えてみます。

A line
like
foo
this 
foo
bar
something
something else
foo
bar
and
the
rest

次のような結果を期待しています。

foo
this 
foo
bar
something
something else
foo
bar

ベストアンサー1

sed -n '/foo/{:a;N;/^\n/s/^\n//;/bar/{p;s/.*//;};ba};'

sed パターンマッチングは/first/,/second/1 行ずつ読みます。一部の行が一致する場合は、/first/それを覚えて、/second/そのパターンに最初に一致するものを探します。同時に、このモードで指定されたすべてのアクティビティが適用されます。その後、ファイルが終了するまでプロセスは引き続き開始されます。

それは私たちに必要なものではありません。最後に一致するパターンを見つける必要があります/second/。だから私たちは最初の入り口だけが見える建物を建てます/foo/。見つかるとループがa始まります。一致バッファに新しい行を追加し、Nパターンと一致することを確認します/bar/。もしそうなら、私たちはそれを印刷してマッチバッファを消去してからjanywayを使ってループの先頭にジャンプしますba

また、clean bufferを使用した後は、改行を削除する必要があります/^\n/s/^\n//。より良い解決策があると確信しています。残念ながら、私はそれを考えていませんでした。

すべてが明確になることを願っています。

おすすめ記事