どんなコマンドでも使用して、次の結果が得られることを願っています。明確にするために編集されました。 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
これはawk
1つのライナーです。
awk '/^abc/ {prev = $0; prevabc = "true"}; /^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print}' file.txt
説明する
/^abc/ {prev = $0; prevabc = "true"};
:行がで始まる場合は、印刷するのではなく、その行の値を変数に保存し、変数に保存してabc
行がprev
で始まることを示します。abc
true
prevabc
/^xyz/ {if (prevabc == "true") {print prev; prevabc = "false" } ; print}
:行がで始まる場合は、xyz
次のようにします。if (prevabc == "true") {print prev; prevabc = "false" }
:前の行がabc
(becauseprevabc == "true"
)で始まる場合は、前の行を印刷してprev
にprevabc
リセットしますfalse
。print
:この行はで始まるので、xyz
この行も印刷してください。