【问题标题】:how to select lines containing several words using sed?如何使用 sed 选择包含多个单词的行?
【发布时间】:2013-10-07 02:08:07
【问题描述】:

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

【问题讨论】:

  • 也许你需要括号?
  • @sam092 即使我使用“ sed '/(alex)|(eva)/!d' file ”它也不起作用。
  • 对不起,我之前的评论不相关。所以你的意思是你想要所有三个词而不是其中任何一个?单词的任何特定顺序?
  • @sam092 是的,已经有了答案,但似乎与“全部”不匹配。
  • 只是因为|应该是“或”的意思

标签: regex unix sed


【解决方案1】:

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

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

【讨论】:

    【解决方案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'
    

    【讨论】:

    • 谢谢,但是 shell 抛出错误说“p 命令末尾有多余的字符”。
    • delete serially 是好的,但是你的版本因为未知原因不能工作。我发现我可以“sed -e '/alex/!d' -e '/eva/!d' -e /tom/!d 文件”
    • 好的,尝试在每个{ 之后和每个} 之前放置换行符,并用换行符替换;。你有什么版本的sed
    • 好吧,我在我的 mac air 的 shell 中测试它,猜是由于 shell 的版本
    【解决方案3】:

    你可以使用:

     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
    

    【讨论】:

    • 感谢它的工作!但是我需要一个包含所有这三个单词而不是其中一个或两个的行,“sed -E'/alex&eva&tom'文件名”不起作用,还有其他方法吗?
    【解决方案4】:

    您应该使用\| 而不是|

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

    【讨论】:

    • 也不行,像这样:sed '/alex\|evva\|tom/!d' filename
    • 为我工作。我正在使用 GNU sed,版本 4.2.1。
    【解决方案5】:

    这可能对你有用(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
    

    【讨论】:

      猜你喜欢
      • 2014-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-11
      相关资源
      最近更新 更多