如何使用sed选择包含多个单词的行?

时间:2013-10-07 02:08:07

标签: regex unix sed

我正在学习在unix中使用sed。 我有一个包含许多行的文件,我想删除除包含字符串的行之外的所有行(例如alex,eva和tom)。 我想我可以用

sed '/alex|eva|tom/!d' filename

但是我发现它不起作用,它无法匹配线路。它只匹配“alex | eva | tom”...... 仅

sed '/alex/!d' filename

作品。

任何人都知道如何使用sed选择包含多于1个单词的行?

加上,括号如“sed'/(alex)|(eva)|(tom)/!d'file”不起作用,我想要包含所有三个单词的行。

5 个答案:

答案 0 :(得分:2)

您可以使用:

 sed -r '/alex|eva|tom/!d' filename

在Mac上的OR:

 sed -E '/alex|eva|tom/!d' filename

使用-i.bak进行内联编辑,以便:

 sed -i.bak -r '/alex|eva|tom/!d' filename

答案 1 :(得分:2)

  

删除除包含字符串的行以外的所有行(例如alex,eva和tom

如你所说,你要求保留包含所有这些单词的行,但你的样本会保留包含任何单词的行。万一“all”不是一个错误的说法:正则表达式不能表达任何顺序搜索,幸运的是sed允许你运行多个匹配:

sed -n '/alex/{/eva/{/tom/p}}'

或者您可以直接删除它们:

sed '/alex/!d; /eva/!d; /tom/!d'

以上适用于GNU /任何系统,使用基于BSD的用户区,您必须插入一堆换行符或将它们作为单独的表达式传递:

sed -n '/alex/ {
          /eva/ {
            /tom/ p
        }
     }'

sed -e '/alex/!d' -e '/eva/!d' -e '/tom/!d'

答案 2 :(得分:2)

sed是一个很好的工具,可以在一行上进行简单的替换,其他任何东西只需使用awk:

awk '/alex/ && /eva/ && /tom/' file

答案 3 :(得分:1)

您应该使用\|代替|

编辑:对于sed的某些变体而言,这似乎是正确的。

答案 4 :(得分:0)

这可能适合你(GNU sed):

sed -nr '/alex/G;/eva/G;/tom/G;s/\n{3}//p' file

此方法允许存在一系列值,即您希望列表中的2个或更多值使用:

sed -nr '/alex/G;/eva/G;/tom/G;s/\n{2,3}//p' file