パターンと一致する場合、パターン一致のすべてのインスタンスをファイルから削除しようとしています。一致がある場合、一致するパターンを含む(完全な)行と次の行が削除されます。
次の行は常にパターンが一致する行の後に表示されますが、さらにファイルの他の領域にも表示されます。
私はgrepを使用していますが、期待どおりにファイル内の次の行をすべて削除しています。
パターンが一致する行の後にある場合にのみ、次の行を削除する方法はありますか?
Awkソリューション:
awk '/pattern/ { matched=1; next }
1 == matched { matched = 0; next }
{ print }' input-file
1行目は、パターンに一致する行を探し、フラグを設定して、その行をスキップします。フラグが設定されている場合、行2は行をスキップしますが、フラグをリセットします。 3行目は、他の2行のいずれかによってスキップされなかった行を印刷します。
必要に応じて、これを1行で入力できます。
awk '/pattern/{matched=1;next} 1==matched{matched=0;next} {print}' input-file
以下は、スキップする行数を制御できるバリエーションです。
awk '/pattern/{skip=3;next} skip>0{--skip;next} {print}' input-file
skip
を(一致した行に加えて)スキップする行数に設定します。
$
でsed
を実行すると、ほとんどのN
sは最後の行を印刷しません。しかし、GNU sed
はそうします。そのため、削除したいパターンが最後の行にあり、あなたがN
であれば、それは印刷されます。 buffer full-同様に、常に2行exceptを印刷したくない行に保持します。
seq 10 | sed -n 'x;/7/!g;//!p'
これは、入力としてseq
を使用した例です。すべての行で、ホールドスペースとパターンスペースを入れ替えます。最後に保留された行が7
(この場合)と一致しない場合、保留スペースが現在の行で上書きされます。次に、プルしたばかりの行(現在の行)も7
と一致しないことを再度確認します。一致しない場合は印刷されません。したがって、すべての行で、前の行と現在の行をチェックします。
1
2
3
4
5
6
9
10
そして、パターンが最後の行にある場合:
seq 10 | sed -n 'x;/10/!g;//!p'
1
2
3
4
5
6
7
8
9
別の例として、何が印刷され、何が印刷されないかをより明確に示すために:
sed -n 'x;/match/!g;//!p
' <<\DATA
match
match
1not
2not
3not
4not
5not
match
6not
match
DATA
2not
3not
4not
5not
cat sample
Pattern line
next after pattern line
this is another
random line
next after pattern line
has occured without.
now we have
another
Pattern line
next after pattern line
let us see the output.
今、私は以下のコマンドを発行します。
sed -e '/Pattern \line/,+1d' sample
これは私が得ている出力です。
this is another
random line
next after pattern line
has occured without.
now we have
another
let us see the output.
パターン行の次の行は、パターンの隣にない別の行として出現しても削除されません。
Michaelのコメントによると、上記の構文はGNU extensionです。次のようなことを試すことができます。
sed -e '/Pattern \line/{N;d}' sample
いかがですか
sed '/pattern/ {$!N;d;}' file