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很容易成为一个文件),然后打印出最后一个字段,然后打印出最后一个字段。 $NFvariables包含在空间上爆炸后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个块。