web-dev-qa-db-ja.com

sedを使用してパターンを照合し、行からファイルの最後まで削除する

パイプで連結された入力やファイルからパターンを照合し、一致した行からファイルの末尾までを削除しようとしています。私はどこを見ても、自分のニーズに合った表現が見つからないようです。

次の式を使用すると、一致したパターンを含めて、ストリームの先頭までを削除できます。

sed -e '1,/Files:/d'

いくつかのサンプルデータがあるとします。

Blah blah blah
Foobar foo foo
Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

-----THIS STUFF IS USELESS-----
BLEH BLEH BLEH
BLEH BLEH BLEH

上記の式を実行すると、以下が生成されます。

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

-----THIS STUFF IS USELESS-----
BLEH BLEH BLEH
BLEH BLEH BLEH

同様の効果を達成したいのですが、反対の方向です。前の式の出力を使用して、-----THIS STUFF IS USELESS-----からファイルの末尾までを削除します。 (最初の式を通過した後)生成されるはずです:

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3

他のPOSIXシステムで利用でき、バージョン固有の(たとえば、GNU固有の)オプションを使用しない限り、他のツールを使用することもできます。

実際のテキストはここにあります: http://Pastebin.com/CYBbJ3qr-----THIS STUFF IS USELESS-----から-----BEGIN PGP SIGNATURE-----への変更に注意してください。

22
Albert H

何故なの

 sed '/^-----THIS STUFF IS USELESS-----$/,$d' file

使用したような範囲式では、 '、$'は「ファイルの終わりまで」を指定します

1 is first line in file, 
$ is last line in file.

出力

Files:
 somefiles.tar.gz 1 2 3
 somefiles.tar.gz 1 2 3


GNU sed、 できるよ

sed '/^-----THIS STUFF IS USELESS-----$/Q' file

ここで、Qq quitコマンドに似ていますが、一致する行を出力しません

35
shellter

必要のないものを表現する方法を理解する代わりに、必要なものを印刷してください。

awk -v RS= '/Files:/' file

編集:あなたの変更された入力を考えると:

awk '/^Files:$/{f=1} f; /^$/{f=0}' file

または:

awk '/^Files:$/{f=1} f; /^-----THIS STUFF IS USELESS-----$/{f=0}' file

必要に応じて。

次のいずれかを使用することもできます。

awk '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file
sed '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file

しかし、後で拡張するのは困難です。

4
Ed Morton
sed -e '/^-----THIS STUFF IS USELESS-----$/,$ d'
4
Brad Lanam

ダーティユーティリティナイフgrepバージョン:

cat your_output.txt | grep -B 99999999 "THIS STUFF IS USELESS" | grep -v "THIS STUFF IS USELESS"
1
mVChr

正規表現は次のとおりです。^(?:(?!Files:).)+|\s*-----THIS STUFF IS USELESS-----.+ dotallフラグを設定してください。

Demo + explanation: http://regex101.com/r/xF2fN5

この1つの式を実行するだけで済みます。

0
Firas Dib