繁体   English   中英

使用sed匹配模式并从行中删除到文件末尾

[英]Using sed to match a pattern and deleting from the line to the end of the file

我正在尝试匹配来自管道输入和/或文件的模式,然后从匹配的行中删除到文件的末尾,包括。 我到处寻找,但似乎找不到符合我需要的表达方式。

以下表达式允许我删除到流的开头,包括匹配的模式:

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-----THIS STUFF IS USELESS-----注意从-----THIS STUFF IS USELESS-----的改变-----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标志。

演示+解释: http//regex101.com/r/xF2fN5

您只需要运行这个表达式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM