如何使用sed捕获最后一列?

时间:2017-12-22 17:49:18

标签: sed

我知道使用awk('{print $NF}')很容易,但出于学习目的,我想了解如何使用sed。

我有一个带有一堆空格分隔值的变量,我想打印最后一个。我以为我可以用贪婪的比赛做到这一点,但是它会在第一个空格之后打印所有内容,而不是在最后一个空格之后的所有内容:

echo $var
"t1": 0.004, "t2": 0.010, "t3": 0.144
echo $var | sed 's/\S*\(.*\)$/\1/'
0.004, "t2": 0.010, "t3": 0.144

当我尝试将其放入带有文本的匹配组中时,我会走得更远:

echo $var | sed 's/[\S*.*]+\(.*\)$/\1/'
"t1": 0.004, "t2": 0.010, "t3": 0.144

1 个答案:

答案 0 :(得分:0)

$ echo ">$var<"
>"t1": 0.004, "t2": 0.010, "t3": 0.144<
$ echo "$var" | sed 's/\S*\(.*\)$/\1/'
 0.004, "t2": 0.010, "t3": 0.144

The regular expression matched as follows:

 \S*
_____
"t1": 0.004, "t2": 0.010, "t3": 0.144
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
                  \(.*\)$

manual page指定正则表达式尽早与匹配

  

如果RE可以匹配给定字符串的多个子字符串,则RE匹配字符串中最早开始的字符串。

要仅返回可选空格所包含的最后一个冒号之后的非空格的最后一个子串,请使用sed -e 's/.*:\s*//'

$ echo "$var" | sed -e 's/.*:\s*//'
0.144

正则表达式匹配如下:

             .*                \s*
______________________________ _
"t1": 0.004, "t2": 0.010, "t3": 0.144
                              ^
                              :