Answers:
匹配整行,因此.*
在正则表达式的开头添加一个。这导致整个行被组的内容替换
echo "foo bar <foo> bla 1 2 3.4" |
sed -n 's/.*\([0-9][0-9]*[\ \t][0-9.]*[ \t]*$\)/\1/p'
2 3.4
(
和)
而不是\(
和,则会出现该错误\)
。
.*
如果您要提取的字符串并不总是在行尾,也请记住将其添加到regexp的末尾。
.*
贪婪和sed没有贪婪.*?
(
并且)
不会在ubuntu 16.04中引发错误。所以我认为这个评论已经过时了。
grep是正确的提取工具。
使用您的示例和正则表达式:
kent$ echo 'foo bar <foo> bla 1 2 3.4'|grep -o '[0-9][0-9]*[\ \t][0-9.]*[\ \t]*$'
2 3.4
grep -o
调用从模式中提取组。stackoverflow.com/a/58314379/117471
cut命令是为这种确切情况而设计的。它将在任何定界符上“剪切”,然后您可以指定应输出的块。
例如:
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
将导致输出:
2 3.4
-d设置分隔符
-f选择要输出的“字段”的范围,在这种情况下,它是原始字符串的第6至第7个块。您也可以将范围指定为列表,例如6,7
。
awk '{ print $2" "$6 }'
cut -d " " -f 2,6
我同意@kent的说法,它非常适合grep -o
。如果需要在模式中提取组,则可以使用第二个grep来完成。
# To extract \1 from /xx([0-9]+)yy/
$ echo "aa678bb xx123yy xx4yy aa42 aa9bb" | grep -Eo 'xx[0-9]+yy' | grep -Eo '[0-9]+'
123
4
# To extract \1 from /a([0-9]+)b/
$ echo "aa678bb xx123yy xx4yy aa42 aa9bb" | grep -Eo 'a[0-9]+b' | grep -Eo '[0-9]+'
678
9
-r
-regexp-extended选项,否则我会收到invalid reference \1 on
s命令的RHS错误。