【问题标题】:grep egrep multiple-stringsgrep egrep 多字符串
【发布时间】:2014-02-24 19:27:27
【问题描述】:

假设我有几个字符串:str1 和 str2 和 str3。

  • 如何找到包含所有字符串的行?
  • 如何找到可以包含其中任何一个的行?
  • 以及如何找到包含 str1 以及 str2 和 str3 [但不是两者都有的行?]?

【问题讨论】:

    标签: regex grep


    【解决方案1】:

    这看起来像三个问题。将这些表达式组合在一起的最简单方法是使用多个管道。这并不丢人,特别是因为正则表达式(使用egrep)会很笨拙,因为您似乎暗示您想要顺序独立。

    所以,按顺序,

    1. grep str1 | grep str2 | grep str3

    2. egrep '(str1|str2|str3)'

    3. grep str1 | egrep '(str2|str3)'

    您可以使用 egrep 以与顺序无关的方式执行“and”形式,但我认为您会发现更容易记住使用管道 grep 执行与顺序无关的 ands 并使用正则表达式执行与顺序无关的 or's。

    【讨论】:

    • 3 不满足“但不是两者”的要求,但该要求很难满足。您需要交替的每一侧都有一个精心设计的前缀和后缀,不包括其他字符串出现在该行中的任何其他位置。
    • @Michael E:“但不是两者”位是斜体字,后面有一个问号,因为当我编辑问题时,我不确定提问者的目的。 @Groundhog 在我用可能应该删除的评论/修改完善/修改问题之前写下了他的(好的)答案。
    • 好的,因此我的评论不再相关。不过,我会保留它,以免您的内容脱离上下文。我没有查看问题的编辑历史记录。
    • @groundhog:你考虑过fgrep吗?
    • @jonathan - 我相信 fgrep 只适用于固定参数字符串,而不是正则表达式。
    【解决方案2】:

    因为grep 不支持前瞻,所以您无法合理地执行“全部”或“此加上其中任何一个”的情况。使用 Perl。对于“任何”情况,它是egrep '(str1|str2|str3)' file

    “全部”情况下不合理的做法是:

    egrep '(str1.*str2.*str3|str3.*str1.*str2|str2.*str1.*str3|str1.*str3.*str2)' file
    

    即你建立排列。这当然是一件可笑的事情。

    对于“这个加上其中任何一个”,类似地:

    egrep '(str1.*(str2|str3)|(str2|str3).*str1)' file
    

    【讨论】:

      【解决方案3】:

      grep -E --color "string1|string2|string3...."

      例如查找我们的系统是使用 AMD(svm) 还是 Intel(vmx) 处理器,如果它是 64bit(lm) lm 代表长模式 - 这意味着 64bit...

      命令示例:

      grep -E --color "lm|svm|vmx" /proc/cpuinfo

      -E 是必须找到多个字符串

      【讨论】:

        【解决方案4】:

        就个人而言,我在 perl 中执行此操作,而不是尝试使用 grep 拼凑一些东西。

        例如,对于第一个:

        while (<FILE>)
        {
           next if ! m/pattern1/;
           next if ! m/pattern2/;
           next if ! m/pattern3/;
        
           print $_;
        }
        

        【讨论】:

        • -1:问题不在于:最好的工具是什么,而是如何使用 grep 来实现。
        • 答案是“不要使用 grep,你会发疯的尝试”
        • @quosoo:在 Unix 程序员中,“grep”可以专门指 grep 程序,也可以指在文本正文中搜索字符串或模式的一般问题。目前尚不清楚蒂姆的意图是什么,所以我认为保罗汤布林的回答是正确的。
        • 您的 perl 答案并不简洁,因为它可以在命令行上完成(使用 perl -pe '/expr/ && /expr/ && /expr/' 并且它没有回答实际问题。
        • @paul: 抱歉,“易于理解”和“perl”不是可链接符号。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-21
        • 2013-04-19
        • 1970-01-01
        • 1970-01-01
        • 2013-08-06
        相关资源
        最近更新 更多