次のように行から最後の列を抽出したいと思います。
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
行区切り文字として解釈されます。