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//
。より良い解決策があると確信しています。残念ながら、私はそれを考えていませんでした。
すべてが明確になることを願っています。