为什么这个`grep -o`失败了,我该如何解决呢?

时间:2009-11-15 03:14:40

标签: regex bash grep

给出输入

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

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

5 个答案:

答案 0 :(得分:9)

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

Grep可能不适合这个; sedtr甚至perl可能会更好,具体取决于实际任务。

答案 1 :(得分:2)

你可以使用shell。它更快

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

这将得到类似的结果:

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

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

答案 4 :(得分:-1)

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

  1. grep -E
  2. egrep(就像Sebastian发布的那样)。
  3. 祝你好运!