繁体   English   中英

Linux:如何使用sed将从模式开始的行删除到另一个模式

[英]Linux: How to delete lines starting at a pattern to another pattern using sed

我知道如何在sed的帮助下删除某些模式。

这是一个例子:

exampleFile

One Two Three Four
Five Six Seven
Eight One Nine Four

如果我应用以下内容,则所有'One'将被删除。

sed 's/\<One\>//g' exampleFile

但是如果我想删除从One到Four的所有内容呢? 我正在寻找的输出是:

Five Six Seven
Eight

我想写下面的内容,但它不起作用:

sed 's/\<One*Four\>//g' exampleFile

(我认为通过放*,它应该意味着删除之间的所有内容,包括一和四)...我的请求是否可能在一行?

谢谢!

在正则表达式中, . 表示“任何字符”, *表示“任意数量的前一个元素”,因此您需要:

sed 's/\<One.*Four\>//g' exampleFile

您可以进一步添加适当的尖括号,以确保One和Four必须是单独的单词:

sed 's/\<One\>.*\<Four\>//g' exampleFile

添加@that其他人的答案,删除空白行

sed -e 's/\<One\>.*\<Four\>//g' -e '/^$/d' exampleFile

这可能适合你(GNU sed):

sed ':a;/\<One\>.*\<Four\>/{s/\<Four\>/\n/;s/\<One\>[^\n]*\n//;/^\s*$/d;ba}' file

这将检查字符串OneFour出现在同一行上,如果是,则用标记( \\n )替换第二个字符串,然后从第一个字符串中删除并包括标记。 如果剩余的行为空或仅包含空格,则删除该行,否则重复该过程直到第一个条件不再适用。

NB这适用于第二个字符串可能出现不止一次的行。 上述方法可以应用于多行,但必须注意确保两个字符串都存在。

暂无
暂无

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

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