文字列から正/負の浮動小数点数を抽出する

文字列から正/負の浮動小数点数を抽出する

一部のテキストから数字を抽出しようとしています。現在私は以下を使用しています:

echo "2.5 test. test -50.8" | tr '\n' ' ' | sed -e 's/[^0-9.]/ /g' -e 's/^ *//g' -e 's/ *$//g' | tr -s ' '

それから2.5、「。」と50.8が表示されます。sed正であれ負であれ、浮動小数点数を検出するために最初のものをどのように変更する必要がありますか?

答え1

grepこれに適しています。

$ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?'
2.5
-50.8

どのように動作しますか?

  • -E

    拡張正規表現を使用してください。

  • -o

    コンテキストではなく一致する項目のみを返します。

  • [+-]?[0-9]+([.][0-9]+)?+

    一致する数字は次のように識別されます。

    • [+-]?

      オプションのブートフラグ

    • [0-9]+

      1つ以上の数字

    • ([.][0-9]+)?

      オプションのピリオドの後に1つ以上の数字が続きます。

1行に出力を受け取る

$ echo "2.5 test. test -50.8" | grep -Eo '[+-]?[0-9]+([.][0-9]+)?' | tr '\n' ' '; echo ""
2.5 -50.8

答え2

一方grep通行:

$ echo "2.5 test. test -50.8" | tr ' ' '\n' | grep -E '^[+-]?[0-9]*\.?([0-9]+)$'
2.5
-50.8
  • trスペースを改行文字に置き換えて、その行を複数行に変換するだけです。

  • このコマンドはgrepオプションまたはで始まり、その後にいくつかの数字とオプションの小数点が続く可能性がある+文字列を探します。-次に、最後に数字を追加する必要があります。

00000123.91288000これにより、奇妙に見えるようなものが通過することがあります。これはフィルタリングしたい数字ですか?技術的には、奇妙な形式の浮動小数点数です。

編集する:到着適切に数字の確認、実行いいえあなた自身の正規表現を書いてください!信頼できる場所でライブラリルーチンを使用してください。

Scalar::Util私の場合は、便利なサブルーチンを持つPerlパッケージを使用しますlooks_like_number()

$ echo "2.5 test. test -50.8" | tr ' ' '\n' | perl -MScalar::Util -ne 'Scalar::Util::looks_like_number($_) && print'
2.5
-50.8

これには、さまざまな形式で数値を照会できるという追加の利点があります1e3

関連情報