我有以下字符串
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并没有停止第一次出现的空间,而是在最后一次出现。我怎样才能捕获到第一次出现?
答案 0 :(得分:3)
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
注意:
表达式(v[^[:blank:]]*)
将捕获以v
开头的任何非空白字符串作为一组。
\s
是不可移植的(仅限GNU)。 [[:blank:]]
将以可靠的方式安全地匹配空格和制表符。
$ echo "$s" | awk '/^v/' RS=' '
v2010.0_1.3
RS=' '
告诉awk将空格视为记录分隔符。 /^v/
将打印以v
开头的任何记录。