パイプで連結された入力やファイルからパターンを照合し、一致した行からファイルの末尾までを削除しようとしています。私はどこを見ても、自分のニーズに合った表現が見つからないようです。
次の式を使用すると、一致したパターンを含めて、ストリームの先頭までを削除できます。
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-----
への変更に注意してください。
何故なの
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
ここで、Q
はq
quitコマンドに似ていますが、一致する行を出力しません
必要のないものを表現する方法を理解する代わりに、必要なものを印刷してください。
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
しかし、後で拡張するのは困難です。
sed -e '/^-----THIS STUFF IS USELESS-----$/,$ d'
ダーティユーティリティナイフgrep
バージョン:
cat your_output.txt | grep -B 99999999 "THIS STUFF IS USELESS" | grep -v "THIS STUFF IS USELESS"
正規表現は次のとおりです。^(?:(?!Files:).)+|\s*-----THIS STUFF IS USELESS-----.+
dotallフラグを設定してください。
Demo + explanation: http://regex101.com/r/xF2fN5
この1つの式を実行するだけで済みます。