2017-09-18 50 views
1

我只v2010.0_1.3使用捕獲一組數字在sed

echo "Text1 Text2 v2010.0_1.3 Tue Jun 6 14:38:31 PDT 2017" | 
sed -nE 's/.*(v.*\s).*/\1/p' 

以下字符串

Text1 Text2 v2010.0_1.3 Tue Jun 6 14:38:31 PDT 2017 

我試圖捕捉和我得到以下結果v2010.0_1.3 Tue Jun 6 14:38:31 PDT。它看起來像sed沒有停止空間的第一次出現,但在最後一次。我怎樣才能捕捉到第一次出現?

+2

'cut -d''-f 3'似乎比sed更合適。 –

回答

3

使用的sed

的sed的正則表達式是「貪婪」(更確切地說,他們是最左邊,最長匹配)。你需要解決這個問題。例如:

$ s="Text1 Text2 v2010.0_1.3 Tue Jun 6 14:38:31 PDT 2017" 
$ echo "$s" | sed -nE 's/.*(v[^[:blank:]]*).*/\1/p' 
v2010.0_1.3 

注:

  1. 表達(v[^[:blank:]]*)將捕獲爲一組非坯料與v開始的任何字符串。

  2. \s不可移植(僅適用於GNU)。 [[:blank:]]可以可靠地工作,以unicode安全的方式匹配空格和製表符。

用awk

$ echo "$s" | awk '/^v/' RS=' ' 
v2010.0_1.3 

RS=' '告訴awk治療空間作爲記錄分隔符。 /^v/將打印以v開頭的任何記錄。

+1

請注意,您應該在'^'之後使用'(v [^ [:blank:]] *)'',只有一個'['''。正如所寫的,您的版本搜索停在'['或空白處。你也可能會發現你的正則表達式中有不平衡的方括號。這是一種好奇心。你必須努力工作才能發現問題,但我相信'T1 T2 v2010.1 [3] 6月6日星期二...'會揭示它。 –