在sed中捕获一组数字

时间:2017-09-18 22:07:27

标签: linux sed

我有以下字符串

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

我尝试使用

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

我得到以下结果v2010.0_1.3 Tue Jun 6 14:38:31 PDT。看起来sed并没有停止第一次出现的空间,而是在最后一次出现。我怎样才能捕获到第一次出现?

1 个答案:

答案 0 :(得分: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:]]将以可靠的方式安全地匹配空格和制表符。

  3. 使用awk

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

    RS=' '告诉awk将空格视为记录分隔符。 /^v/将打印以v开头的任何记录。