ファイルからパターン一致のすべてのインスタンスを削除しようとしています(パターンと一致する場合)。一致するものがある場合は、一致するパターンを含む(完全な)行と次の行が削除されます。
次の行は常にパターンと一致する行の後に表示されますが、そうでない場合はファイルの別の領域に表示されます。
私はgrepを使用しており、期待どおりにファイルから次の行のすべてのエントリを削除します。
パターンに一致する行の後に来る場合にのみ、次の行を削除する方法はありますか?
答え1
答え2
この機能をオンにすると、ほとんどのsed
sは最後の行を印刷しません。しかし、GNUはそうです。したがって、削除したいパターンが最後の行にある場合は印刷されます。時にはバッファをいっぱいにする方が良いかもしれません。たとえば、常に2行を維持します。N
$
sed
N
とは別に印刷したくない行に。次のことができます。
seq 10 | sed -n 'x;/7/!g;//!p'
以下は入力の例ですseq
。各ラインでホールドスペースとパターンスペースを交換します。最後に保持された行が次の場合7
(この場合)予約済みスペースを現在の行で上書きします。その後、インポートした行(現在の行)が mismatch と一致するかどうかを再確認し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
答え3
奇妙な解決策:
awk '/pattern/ { matched=1; next }
1 == matched { matched = 0; next }
{ print }' input-file
ライン1は、パターンに一致するラインを見つけてフラグを設定し、ラインをスキップします。 2行目はフラグを設定すると1行をスキップしますが、フラグをリセットします。 3行目は、他の2行のうちの1つがスキップしない行を印刷します。
必要に応じて、次の行を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
スキップする必要がある行数(一致する行に加えて)を設定します。
答え4
どうですか?
sed '/pattern/ {$!N;d;}' file