1

次のようなファイルがあります。

Guest-List 1
All present
Guest-list 2
All present
Guest-List 3
Guest-list 4
All present
Guest-list 5

「All present」とそのタイトルを含む行 (「All present」のすぐ上の行) を削除したいと考えています。望ましい出力は次のようになります。

Guest-List 3
Guest-list 5

sedを使用してこれを実装することに興味があります。私は新人なので、sed を使用しない他の可能な解決策も歓迎します (回答するときは、学習できるように詳細な説明を提供してください):)

(正規表現に一致する行を削除し、その上の行をホールド バッファーに送信して、次のように保存できることはわかっています。コマンドは、ホールド バッファーをパターン スペースにコピーして戻します...しかし、sed にそれも削除するように指示するにはどうすればよいですか?)

前もって感謝します!

4

3 に答える 3

3

fgrep次のように使用できます。

fgrep -v -f <(fgrep 'All present' -B1 file) file
Guest-List 3
Guest-list 5
于 2013-10-08T21:03:36.973 に答える
2
sed -n '/All present$/{s/.*//;x;d;};x;p;${x;p;}' file | sed '/^$/d'

ファイルはどこfileにありますか。

これは here からの適応例です。

素晴らしい説明があります:

パターンの前の行を削除するために、すべての行をホールド スペースと呼ばれるバッファーに格納します。パターンが一致するたびに、現在の行を含むパターン スペースと前の行を含むホールド スペースの両方に存在するコンテンツを削除します。

このコマンドについて説明しましょうx;p;。これは行ごとに実行されます。 xパターン スペースの内容をホールド スペースと交換します。pパターンスペースを印刷します。その結果、毎回、現在の行がスペースを保持し、前の行がパターン スペースになり、印刷されます。パターンが/All Present/一致した場合、s/.*//パターン空間を empty( ) し、ホールド空間と交換 (x結果としてホールド空間が空になる) しd、前の行を含むパターン空間を削除 ( ) します。したがって、パターン Linux に遭遇すると、現在および前の行が削除されます。これ${x;p;}は、残っている場合に保留スペースに残る最後の行を印刷することです。

の 2 番目の部分は、最初のコマンドsedで作成された空行を削除することです。sed

于 2013-10-08T20:51:57.673 に答える