我想从如下所示的行中提取最后一列:
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
行分隔符。