[英]pattern match and add line at the end or start of a line in a text file using 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.