2009-11-15 74 views
9

鉴于输入为什么`grep -o`失败,我应该如何解决它?

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)上运行。是否有“正确的方法”来获得一致的行为?

+1

为什么你想要一个可以匹配零个字符的正则表达式呢?我希望它匹配每一行,而不仅仅是数字的行。 – 2009-11-15 03:58:14

回答

9

是,2.5.1的-o处理是越野车: http://www.mail-archive.com/[email protected]/msg00993.html

grep的大概不是这个合适的工具; sed或甚至perl可能会更好取决于实际任务是什么。

+0

+1:但是,如果GNU'grep'版本之间存在差异(虽然由于缺陷),但在不同计算机之间寻找一致性的机会并不多。不过,还有很多其他工具。 – pavium 2009-11-15 03:51:12

+1

如果没有正确的解决方案,推荐使用其他工具并不是一个好的答案。作为证据,在大多数情况下,它可以通过使用纯粹的bash来解决。你没有为我提供一个确切的解决方案。 – kisp 2013-08-23 21:32:56

0

这将使类似的结果:

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

你的问题的this one近重复。

2

你可以使用shell。其更快

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

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

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

由于您使用的是正则表达式,所以你必须使用:

  1. 的grep -E
  2. egrep的(像塞巴斯蒂安发布)。

祝你好运!

+2

-E/egrep是* extended *正则表达式所必需的; '[0-9] *'是一个有效的基本正则表达式。 ('grep'中的're'代表正则表达式)。也许2.5.1中的错误并不存在于扩展的正则表达式支持中,但仅使用正则表达式的事实并不意味着您需要-E。 – chepner 2012-07-27 23:53:45

相关问题