web-dev-qa-db-ja.com

パターンが一致する行と次の行を削除します

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

次の行は常にパターンが一致する行の後に表示されますが、さらにファイルの他の領域にも表示されます。

私はgrepを使用していますが、期待どおりにファイル内の次の行をすべて削除しています。

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

23
kenuse

sedは、 N コマンドと d コマンド、および {}ブロック

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

pattern hereに一致するすべての行で、{}のコードが実行されます。 Nは次の行もパターンスペースに入れ、次にdはすべてを削除してから次の行に移動します。これは、POSIX互換のsedで機能します。

25
Michael Homer

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を(一致した行に加えて)スキップする行数に設定します。

5
Kenster

$sedを実行すると、ほとんどのNsは最後の行を印刷しません。しかし、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
5
mikeserv
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
4
Ramesh

いかがですか

sed '/pattern/ {$!N;d;}' file
4
steeldriver