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

时间:2014-10-24 23:09:56

标签: linux sed

我知道如何在sed。

的帮助下删除某些模式

以下是一个例子:

exampleFile

One Two Three Four
Five Six Seven
Eight One Nine Four

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

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

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

Five Six Seven
Eight

我考虑过编写以下内容,但它不起作用:

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

(我认为通过放*,它应该意味着删除其中的所有内容,包括一和四)...我的请求甚至可以在一行中吗?

谢谢!

3 个答案:

答案 0 :(得分:2)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:0)

这可能适合你(GNU sed):

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

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

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