パターン一致行と次の行を削除

パターン一致行と次の行を削除

ファイルからパターン一致のすべてのインスタンスを削除しようとしています(パターンと一致する場合)。一致するものがある場合は、一致するパターンを含む(完全な)行と次の行が削除されます。

次の行は常にパターンと一致する行の後に表示されますが、そうでない場合はファイルの別の領域に表示されます。

私はgrepを使用しており、期待どおりにファイルから次の行のすべてのエントリを削除します。

パターンに一致する行の後に来る場合にのみ、次の行を削除する方法はありますか?

答え1

あなたはsedそれを使用することができますNそしてdコマンドと{}詰まった:

sed -e '/pattern here/ { N; d; }'

一致する各行に対してのpattern hereコードが実行されます{}Nまた、次の行をパターン空間に配置し、d次の行を続行する前にすべてを削除します。これはすべてのPOSIX互換で機能しますsed

答え2

この機能をオンにすると、ほとんどのsedsは最後の行を印刷しません。しかし、GNUはそうです。したがって、削除したいパターンが最後の行にある場合は印刷されます。時にはバッファをいっぱいにする方が良いかもしれません。たとえば、常に2行を維持します。N$sedNとは別に印刷したくない行に。次のことができます。

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

関連情報