1

我正在学习在 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”这样的括号不起作用,我想要包含所有三个单词的行。

4

5 回答 5

3

sed 是在单行上进行简单替换的出色工具,其他任何事情只需使用 awk:

awk '/alex/ && /eva/ && /tom/' file
于 2013-10-07T19:53:07.950 回答
2

您可以使用:

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

或在 Mac 上:

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

用于-i.bak内联编辑,因此:

 sed -i.bak -r '/alex|eva|tom/!d' filename
于 2013-10-07T02:18:16.727 回答
2

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

按照措辞,您要求保留包含所有这些单词的行,但您的示例保留包含任何单词的行。以防万一“all”不是误会:正则表达式不能表达任何顺序的搜索,幸运的是 sed 允许您运行多个匹配项:

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

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

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

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

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

或者

sed -e '/alex/!d' -e '/eva/!d' -e '/tom/!d'
于 2013-10-07T02:25:11.687 回答
1

您应该使用\|而不是|.

编辑:看起来这对于 sed 的某些变体是正确的,但对于其他变体则不是。

于 2013-10-07T02:14:12.407 回答
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
于 2013-10-08T06:06:41.237 回答