26

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

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

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-----

4

5 に答える 5

39

なぜだめですか

 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

whereQはquitコマンドに似てqいますが、一致する行を出力しません

于 2012-12-26T22:24:30.657 に答える
5

不要なものを表現する方法を理解しようとする代わりに、必要なものを印刷するだけです。

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

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

于 2012-12-26T22:26:04.193 に答える
4
sed -e '/^-----THIS STUFF IS USELESS-----$/,$ d'
于 2012-12-26T22:26:11.890 に答える
2

汚れた万能ナイフのgrepバージョン:

cat your_output.txt | grep -B 99999999 "THIS STUFF IS USELESS" | grep -v "THIS STUFF IS USELESS"
于 2012-12-26T22:29:13.907 に答える
0

これがあなたが望むことをするだろうと私が思う正規表現です:^(?:(?!Files:).)+|\s*-----THIS STUFF IS USELESS-----.+必ずdotallフラグを設定してください。

デモ+説明: http: //regex101.com/r/xF2fN5

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

于 2012-12-26T22:26:04.487 に答える