特定の文字列と次の行を含む行を削除します

これを使用します

cat foo.txt | sed "/bar/d"

ファイル内の文字列barを含む行を削除します。

ただし、これらの行とその行を直接削除したいのですがその後。できれば、sedawk、またはMinGW32で利用可能なその他のツールで。

それは一種の逆です。 grep-A-Bを使用して、一致する行も印刷することができます。一致した行の前後の行として。

それを実現する簡単な方法はありますか?

コメント

  • 情報:エントリが2ライナーであるログを'分析しています。そのため、パターンに一致するエントリを見つけて、次の行と同様に削除したいと思います。したがって、'連続する一致行を処理する必要はありませんが、とにかく回答の完全性に感謝します!

回答

GNU sedを使用している場合(LinuxまたはCygwinが埋め込まれていない場合):

sed "/bar/,+1 d" 

2行連続でbarがある場合、2行目を分析せずに削除します。たとえば、3行のファイルbar / bar / fooがある場合、 foo行は残ります。

コメント

  • 長さは+1 :)特に例'連続したbarがないため、これは非常に覚えやすいです。
  • sed '/bar/d' "特定の文字列を含む行を削除する場合"およびしない次。
  • 計算後にすべての行を削除したい場合は?
  • @Pandya 'は異なります。あなたは例えばを使用することができますsed '/math/q'
  • @ A.K。一致する行を削除したいだけの場合は、'さらに簡単です:sed '/bar/d'

回答

barが連続した行で発生する可能性がある場合は、次のようにします。

awk "/bar/{n=2}; n {n--; next}; 1" < infile > outfile 

上記の2行を、一致する行を含む削除する行数に変更することで、2行以上を削除するように調整できます。

そうでない場合は、 「sed @MichaelRollins “ソリューションまたは:

コメント

  • AWKソリューションのもう1つの利点は、/bar/を次のように置き換えることができることです。 /bar|baz|whatever/sedでは、構文が機能しないようです'。
  • @ jakub.g、GNU sed( v4.4になりました)。他の人についてはよくわかりません。私が知っているのは、デフォルトで" basic "正規表現構文を使用していることです。これが、例で動作しません。目的を達成するには、各垂直線の前に円記号を付けるか、sedに"拡張

正規表現。詳細については、 gnu.org/software/sed/manual/html_node/ … をご覧ください。これはgrepにも適用されることに注意してください。ここに'私自身の実例があります:echo $'0a\n1b\n2c' | sed '/0a\|1b/d'

回答

私はsedに堪能ではありませんが、awkで簡単に行うことができます:

awk "/bar/{getline;next} 1" foo.txt 

awkスクリプトは次のように読み取ります。barを含む行の場合、次の行を取得し(getline)、後続のすべての処理をスキップします(next)。最後の1パターンは、残りの行を印刷します。

更新

コメントで指摘されているように、上記のソリューションは、連続するbar。これを考慮した改訂されたソリューションは次のとおりです。

awk "/bar/ {while (/bar/ && getline>0) ; next} 1" foo.txt 

すべての/ bar /行をスキップするために読み続けます。

コメント

  • grep -Aを100%複製するには、連続する行を正しく(ブロック全体とその後の1行を削除することにより)

回答

これを実現するには、sedのスクリプト機能を利用する必要があります。

$ sed -e "/bar/ { $!N d }" sample1.txt 

サンプルデータ:

$ cat sample1.txt foo bar biz baz buz 

「N」コマンドは、入力の次の行をパターンスペースに追加します。これをパターン一致の行(/ bar /)と組み合わせると、削除する行になります。その後、削除できます。 「d」コマンドで通常どおり削除します。

コメント

  • コンソールに改行を入力するにはどうすればよいですか?または、これはスクリプトのみですか?
  • @ jakub.g:GNU sedを使用:sed -e '/bar/{N;d}' sample1.txt

回答

一致の直後の行を削除する必要がある場合、sedプログラムは連続した一致を考慮する必要があります。言い換えると、一致する一致に続く行を削除する場合は、おそらくそれに続く行も削除する必要があります。

これは簡単に実装されますが、少し後ろを見る必要があります。 。

printf %s\\n 0 match 2 match match \ 5 6 match match match \ 10 11 12 match 14 15 | sed -ne"x;/match/!{g;//!p;}" 

 0 6 11 12 15  

読み込まれた各行のホールドスペースとパターンスペースを交換することで機能するため、最後の行を毎回現在の行と比較できます。したがって、sedが行を読み取ると、バッファの内容が交換されます。前の行は編集バッファの内容になり、現在の行は保留スペースに配置されます。

したがって、sedは、前の行で match と一致するかどうかを確認します。 !が見つかりません{関数}で2つの式が実行されます。 sedgパターンスペースを上書きすることでホールドスペースを取得します。つまり、現在の行はホールドスペースとパターンスペースの両方にあります。次に、//最後にコンパイルされた正規表現との一致をチェックします- match -そして match でない場合はpリントされます。

これは、行が match および直前の行が印刷されない場合にのみ印刷されることを意味します。 match 。また、 match のシーケンスの不要なスワップを排除します。

任意の数の行を削除できるバージョンが必要な場合 match の後に発生する場合は、もう少し作業が必要になります:

printf %s\\n 1 2 3 4 match \ match match 8 \ 9 10 11 12 13 \ 14 match match \ 17 18 19 20 21 | sed -net -e"/match/{h;n;//h;//!H;G;s/\n/&/5;D;}" -ep 

。 ..5を削除する(一致した行を含む)行数に置き換えます…


1 2 3 4 12 13 14 21 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です