正则表达式到 grep 填充符,然后是带符号的浮点数

正则表达式到 grep 填充符,然后是带符号的浮点数

我想从如下所示的行中提取最后一列:

880.952         NAV_Y                uSimMarine      -146.17516

该数字并不总是负数,并且不是固定长度(即并不总是具有相同的小数位数)。

这让我明白了大部分内容:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

但它也与第一列中的数字匹配。

如果我将其更改为包含行尾以消除第一列匹配:

grep -E "[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

我没有得到任何匹配,我不明白。

我在这里缺少什么?

答案1

将表达式锚定到行尾:

grep -E "\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$"

如果您添加 PCRE 选项以-o仅返回捕获的组,您将看到您的示例匹配并返回所需的匹配:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}$)"

-146.17516

同样,要捕获文件中带有可选尾随空格的行的匹配项,只需添加\s*为:

grep -oE "(\-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}\s*$)"

答案2

在第一个正则表达式之前加一个空格:

grep -E "\s+-?[[:digit:]]{1,3}\.[[:digit:]]{0,5}"

应该可以解决问题,因为它排除了行开头的匹配。

如果你想只是第四列,您可以使用 GNU sed 轻松实现:

sed -r 's/^\S+\s+\S+\s+\S+\s+(\S+)(\s.*|)$/\1/'

其中\s是任何空白字符(空格、制表符和各种“提要” 1)和\S非空格字符,或者(以更简洁的方式)sed | cut

sed 's/\s\+/\t/g' | cut -f4

它首先将所有空格压缩为一个选项卡,然后用于cut剪切第四列。它还允许您轻松选择更多列,例如 withcut -f1,4等。

1)即:换页、换行、回车,尽管中间的通常被解释为sed行分隔符。

相关内容