上記以外の一致の前にある行を標準出力から削除します。

上記以外の一致の前にある行を標準出力から削除します。

どんなコマンドでも使用して、次の結果が得られることを願っています。明確にするために編集されました。 1行ではなく^ xyzの前にあるすべての^ abcを削除しようとしています。

標準出力:

abc def
abc ghi
abc jkl
xyz mno
xyz pqr
abc def
abc ghi
abc jkl
xyz mno
xyz pqr

望ましい結果:

abc jkl
xyz mno
xyz pqr
abc jkl
xyz mno
xyz pqr

答え1

ループを使用して2行のバッファを保持し、削除N Dする前に最初の行を印刷できます(xyzバッファにある場合のみ)。

$ cat stdout | sed ':a; $!N; /xyz/P; D; ba'
abc jkl
xyz mno
xyz pqr
abc jkl
xyz mno
xyz pqr

答え2

これはawk1つのライナーです。

awk '/^abc/ {prev = $0; prevabc = "true"}; /^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print}' file.txt

説明する

  • /^abc/ {prev = $0; prevabc = "true"};:行がで始まる場合は、印刷するのではなく、その行の値を変数に保存し、変数に保存してabc行がprevで始まることを示します。abctrueprevabc
  • /^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print}:行がで始まる場合は、xyz次のようにします。
    • if (prevabc == "true") {print prev; prevabc = "false" }:前の行がabc(because prevabc == "true")で始まる場合は、前の行を印刷してprevprevabcリセットしますfalse
    • print:この行はで始まるので、xyzこの行も印刷してください。

関連情報