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