正規表現を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}"

行の先頭の一致を除外するので、これでうまくいくはずです。

あなたが望むならただ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 つのタブに圧縮し、次に を使用してcut4 番目の列を切り取ります。また、などを使用して、より多くの列を簡単に選択することもできますcut -f1,4

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

関連情報