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

我试图从pipe道input和/或文件中匹配一个模式,然后从匹配的行中移除到文件末尾。 我到处寻找,但似乎无法find一个适合我的需求的expression。

下面的expression式允许我删除到stream的开头,包括匹配的模式:

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 

运行上面的expression式会产生:

 Files: somefiles.tar.gz 1 2 3 somefiles.tar.gz 1 2 3 -----THIS STUFF IS USELESS----- BLEH BLEH BLEH BLEH BLEH BLEH 

我想达到类似的效果,但方向相反。 使用从前面的expression式的输出,我想从-----THIS STUFF IS USELESS-----到文件的末尾,包括端点。 它应该产生(经过第一个expression式之后):

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

我也愿意使用任何其他工具,只要它在任何其他POSIX系统上可用,并且不使用版本特定的(例如GNU特定的)选项。

实际的文字可以在这里find: http : -----THIS STUFF IS USELESS-----注意从-----THIS STUFF IS USELESS-----的变化-----THIS STUFF IS USELESS-----开始-----BEGIN PGP SIGNATURE-----

Solutions Collecting From Web of "使用sed来匹配模式并从行中删除到文件的末尾"

为什么不

  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 

IHTH

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

而不是试图找出如何表达你不想要的东西,只要打印你想要的东西:

 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 

但以后很难延续。

脏公用刀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

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