【问题标题】:Why does this `grep -o` fail, and how should I work around it?为什么这个 `grep -o` 会失败,我应该如何解决它?
【发布时间】:2010-12-16 17:24:07
【问题描述】:

给定输入

echo abc123def | grep -o '[0-9]*'

在一台计算机上(使用 GNU grep 2.5.4)返回123,而在另一台计算机上(使用 GNU grep 2.5.1)返回空字符串。是否有一些解释为什么 grep 2.5.1 在这里失败,或者它只是一个错误?我以这种方式在我希望能够在不同计算机上运行的 bash 脚本中使用grep -o(可能有不同版本的 grep)。是否有“正确的方法”来获得一致的行为?

【问题讨论】:

  • 你为什么要在一个可以匹配零个字符的正则表达式上使用 grep 呢?我希望它匹配每一行,而不仅仅是其中包含数字的行。

标签: regex bash grep


【解决方案1】:

是的,2.5.1 的 -o 处理有问题: http://www.mail-archive.com/bug-grep@gnu.org/msg00993.html

Grep 可能不是解决此问题的正确工具; sedtr 甚至 perl 可能会更好,具体取决于实际任务。

【讨论】:

  • +1:但是如果 GNU grep 的次要版本之间存在差异(尽管由于错误),那么在不同计算机之间找到一致性的机会就很小。不过,还有很多其他工具。
  • 在没有正确解决方案的情况下推荐使用其他工具不是一个好的答案。作为证据,在大多数情况下,它可以通过使用纯 bash 来解决。您没有为我提供确切的解决方案。
【解决方案2】:

你可以使用外壳。它更快

$ str=abc123def
$ echo ${str//[a-z]/}
123

【讨论】:

    【解决方案3】:

    我遇到了同样的问题,发现那台机器上安装了egrep。一个快速的解决方案是使用

     echo abc123def | egrep -o '[0-9]*'
    

    【讨论】:

      【解决方案4】:

      这将给出类似的结果:

      echo abc123def | sed -n 's/[^0-9]*\([0-9]\+\).*/\1/p'
      

      您的问题与this one 几乎重复。

      【讨论】:

        【解决方案5】:

        因为您使用的是正则表达式,所以您必须使用:

        1. grep -E
        2. egrep(就像 Sebastian 发布的那样)。

        祝你好运!

        【讨论】:

        • -E/egrep 是 extended 正则表达式所必需的; '[0-9]*' 是一个有效的基本正则表达式。 (“grep”中的“re”代表正则表达式)。也许 2.5.1 中的 bug 没有出现在扩展的正则表达式支持中,但仅仅使用正则表达式这一事实并不意味着您需要 -E。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-25
        • 1970-01-01
        • 2019-10-07
        • 1970-01-01
        相关资源
        最近更新 更多