sed:只打印匹配组
我想抓住最后两个数字(一个int,一个浮点数;接着是可选的空格),只打印它们。
例:
foo bar <foo> bla 1 2 3.4
应该打印:
2 3.4
到目前为止,我有以下几点:
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/replacement/p'
会给我
foo bar <foo> bla 1 replacement
但是,如果我尝试将其replace为组1,则会打印整行。
sed -n 's/\([0-9][0-9]*[\ \t][0-9.]*[\ \t]*$\)/\1/p'
我怎样才能打印只匹配组中正则expression式的行部分?
匹配整行,所以在你的正则expression式的开头添加一个.*
。 这导致整个行被replace为组的内容
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
grep是提取的正确工具。
使用你的例子和你的正则expression式:
kent$ echo 'foo bar <foo> bla 1 2 3.4'|grep -o '[0-9][0-9]*[\ \t][0-9.]*[\ \t]*$' 2 3.4
而另一个select,我会用awk去!
echo "foo bar <foo> bla 1 2 3.4" | awk '{ print $(NF-1), $NF; }'
这将在空间上分割input(我在这里使用STDIN,但你的input很容易成为一个文件),然后打印出最后一个字段,然后打印出最后一个字段。 $NF
variables包含在空间上爆炸后find的字段数。
这样做的好处是,如果最后两个字段之前的内容发生了变化,只要您只希望最后两个字段可以继续工作,则无关紧要。
cut命令是为了这个确切的情况而devise的。 它会“剪切”任何分隔符,然后你可以指定哪个块应该输出。
例如: echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
echo "foo bar <foo> bla 1 2 3.4" | cut -d " " -f 6-7
将导致输出: 2 3.4
-d设置分隔符
-fselect要输出的“字段”的范围,在这种情况下,它是原始string的第6到第7个块。