2017-06-09 4 views
2

正規表現を使用して浮動小数点数の科学的表記をgrepにマッチさせている。私の問題は次のとおりです:正規表現を使用して科学的形式でgrepに浮動小数点数をマッチングする

ファイル内にすべての浮動小数点数(科学的表記で表現されています)を取得したいのですが、このファイルにも他の文字列があります。 ファイルの内容は次のように好き:

This product is subject to U.S. laws governing export and re-export. 
Case run remote-shell. 
33080 2.7122e-03 3.7837e-05 4.3489e-05 1.3267e-04 2.7229e-05 4.1196e-05 3.0528e-04 4.7660e-04 5.9506e-06 8.1338e-04 6.6428e-04 1.0230e-04 6.1385e-04 5.3061e-05 4.8918e-04 8.1832e-05 7.5350e-04 6.8355e-04 3.5495e-04 4.3668e-04 1.0076e-04 1.4759e-05 3.3033e-05 3.7662e-05 4.2165e-04 5.1842e-05 3.2158e-04 1.5356e-03 4.2839e-05 2.9283e-04 1.6930e-05 4.9191e-05 3.2135e-05 1.8665e-04 1.6677e-05 3.2952e-04 4.4912e-05 5.6932e-05 1.1145e-03 5.7499e-04 2.1972e-04 3.6925e-05 1.1579e-03 3.9610e-04 3.6176e-04 1.4320e-04 5.9517e-04 2.4946e-04 9.8161e-06 5.3642e-04 5.0760e-03 4.1630e-05 9.5973e-05 5.7817e-05 3.1283e-04 4.4210e-04 9.7502e-06 1.8566e+03 3.0613e-01 0:37:35 1922 
33040 3.7547e-03 2.5260e-05 3.0029e-05 9.4277e-05 2.0479e-05 2.4130e-05 1.9597e-04 8.9547e-04 4.2917e-06 5.7030e-04 3.9776e-04 5.8403e-05 3.9431e-04 4.6212e-05 3.2378e-04 4.0916e-05 2.9765e-04 2.7011e-04 2.1954e-04 2.3628e-04 9.6072e-05 1.1480e-05 2.3660e-05 2.4469e-05 2.9498e-04 2.8080e-05 1.9791e-04 1.4410e-03 2.8925e-05 1.8617e-04 1.4366e-05 3.5216e-05 2.9843e-05 1.7923e-04 1.2372e-05 2.0673e-04 3.1176e-05 5.0167e-05 7.0653e-04 3.6454e-04 1.9928e-04 2.2903e-05 8.3425e-04 2.1208e-04 1.7543e-04 9.5440e-05 3.4135e-04 1.7607e-04 7.2080e-06 5.5701e-04 2.9932e-03 3.6117e-05 8.8722e-05 5.1176e-05 2.3192e-04 1.2000e-03 5.9996e-06 1.8570e+03 3.0613e-01 0:38:28 1962 

私が試した:

grep "[0-9]*\.\?[0-9]*[eE][+-][0-9]*" filename 

それは確かに科学的表記ですべての数字を除外することができます。しかしのような言葉は、再エクスポートリモートシェルも除外されます。それは私にとっては奇妙です。それから私は\を取り除いた?修飾子:

grep "[0-9]*\.[0-9]*[eE][+-][0-9]*" filename 

再輸出リモート・シェルのような言葉が含まれていないこの時間。しかし、私は本当に\と混同されていますか?修飾子は直前の項目を表します。 (ドット)はオプションです。なぜなら、それはオプションの前にすべてをすべて作るからですか?なぜこのようなことが起こったのか誰にも説明でき、\ itemの前に単一の項目を作るだけの解決策を提供できますか?修飾子は後でオプションです。この2e-3のような数字もフィルタリングする必要があります。

+0

私はあなたが答えを受け入れない気づい(初回のみ1が受け入れられています) 。回答を受け入れるために+2のポイントを得ることに注意してください。それをしてください。あなたのために働いたあなたの質問のすべての回答を受け入れることを検討してください([回答を受け入れる方法](http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)を参照)あなたの役に立つ答えがあればアップアップしてください([Stack Overflowについてのアップルのしくみ方法](http://meta.stackexchange.com/questions/173399/how-to-upvote-on-stack-overflow)参照) 。 –

+0

あなたの質問には、それぞれのfp番号を自分自身の出力行にするか、少なくとも1つのfp番号を含む行にするか、それとも何か他のものがあるかどうかが分かりません。 wrt '後で私はこの2e-3'のような数字をフィルタリングする必要もあります - 入力データの複数のパスを見る必要はほとんどありません真に代表的な入力は、あなたを助けてくれるでしょう。 –

答えて

2

についての答えは、なぜそれが起こるは簡単です:それはe-e+E-E+のいずれかに一致しますので、あなたの正規表現の唯一の義務サブパターンは、[eE][+-]です。

番号を強制する必要があります。それはあなたがサポートする必要がある番号形式の種類によって異なりますが、ほとんどの場合、あなたは1回以上の繰り返しに一致するように+数量詞を使用することができます:

"[0-9]*\.\?[0-9]\+[eE][+-][0-9]*" 
       ^^ 
+0

おそらく最初の '[0-9]'の前の '.'も必須です。 – slezica

+0

@slezica:この正規表現のバリエーションはたくさんありますので、OPを正しい方向に向けることができます。[' grep -E '[0-9] +?[0-9] +)([eE] [+ - ] [0-9] +)?' '](https: /regex101.com/r/8cz4np/1)はさらに優れています。 '[0-9]'だけが少なくとも1桁の数字と一致しなければなりません。 –

+0

確かに、私は将来の読者のためにそれを指摘していた、これは完全に良い答えです:) upvoteは私のです – slezica

関連する問題