Alb*_*t H 21 regex unix linux bash sed
我正在尝试匹配来自管道输入和/或文件的模式,然后从匹配的行中删除到文件的末尾,包括.我到处寻找,但似乎找不到符合我需要的表达方式.
以下表达式允许我删除到流的开头,包括匹配的模式:
sed -e '1,/Files:/d'
Run Code Online (Sandbox Code Playgroud)
给出一些样本数据:
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
Run Code Online (Sandbox Code Playgroud)
运行上面的表达式会产生:
Files:
somefiles.tar.gz 1 2 3
somefiles.tar.gz 1 2 3
-----THIS STUFF IS USELESS-----
BLEH BLEH BLEH
BLEH BLEH BLEH
Run Code Online (Sandbox Code Playgroud)
我想达到类似的效果,但方向相反.使用前一个表达式的输出,我想删除-----THIS STUFF IS USELESS-----文件的末尾,包括.它应该产生(在经过第一个表达式之后):
Files:
somefiles.tar.gz 1 2 3
somefiles.tar.gz 1 2 3
Run Code Online (Sandbox Code Playgroud)
我也愿意使用任何其他工具,只要它可以在任何其他POSIX系统上使用,并且不使用特定于版本(例如GNU特定)的选项.
实际文本可以在这里找到:http://pastebin.com/CYBbJ3qr
注意从更改-----THIS STUFF IS USELESS-----到-----BEGIN PGP SIGNATURE-----.
she*_*ter 34
为什么不
sed '/^-----THIS STUFF IS USELESS-----$/,$d' file
Run Code Online (Sandbox Code Playgroud)
在您使用的范围表达式中,',$'将指定"到文件的末尾"
1 is first line in file,
$ is last line in file.
Run Code Online (Sandbox Code Playgroud)
产量
Files:
somefiles.tar.gz 1 2 3
somefiles.tar.gz 1 2 3
Run Code Online (Sandbox Code Playgroud)
有了GNU sed,你可以做到
sed '/^-----THIS STUFF IS USELESS-----$/Q' file
Run Code Online (Sandbox Code Playgroud)
where Q与qquit命令类似,但不打印匹配行
不要试图弄清楚如何表达你不想要的东西,只需打印你想要的东西:
awk -v RS= '/Files:/' file
Run Code Online (Sandbox Code Playgroud)
编辑:鉴于您修改后的输入:
awk '/^Files:$/{f=1} f; /^$/{f=0}' file
Run Code Online (Sandbox Code Playgroud)
或者:
awk '/^Files:$/{f=1} f; /^-----THIS STUFF IS USELESS-----$/{f=0}' file
Run Code Online (Sandbox Code Playgroud)
若你宁可。
您还可以使用以下任一方法:
awk '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file
sed '/^Files:$/,/^-----THIS STUFF IS USELESS-----$/' file
Run Code Online (Sandbox Code Playgroud)
但是以后很难扩展。
| 归档时间: |
|
| 查看次数: |
29794 次 |
| 最近记录: |