![](/img/trans.png)
[英]How to delete 5 lines before and 6 lines after pattern match using 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
这将检查字符串One
和Four
出现在同一行上,如果是,则用标记( \\n
)替换第二个字符串,然后从第一个字符串中删除并包括标记。 如果剩余的行为空或仅包含空格,则删除该行,否则重复该过程直到第一个条件不再适用。
NB这适用于第二个字符串可能出现不止一次的行。 上述方法可以应用于多行,但必须注意确保两个字符串都存在。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.