2009-11-15 128 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

相關問題