フィラーを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つもなく、わかりません。

私がここで何を見逃しているのでしょうか?

答え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}"

行の先頭から一致するものを除外するので、トリックを実行する必要があります。

欲しいならただ4番目の列では、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

まず、すべてのスペースを1つのタブに圧縮してから、4番目の列を切り取るためにcut使用されます。また、cut -f1,4などのようなより多くの列を簡単に選択できます。

1)つまり、フォームフィード、ラインフィード、キャリッジリターンがありますが、それらの間の項目は通常、sed行区切り文字として解釈されます。

関連情報