正規表示式到 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行分隔符號。

相關內容