1

bash を使用してファイルから数値を収集しようとしています。私のファイルは次のようになります。

number = 123;

次のコマンドを使用して取得します。

grep number file.txt | tr -dc 0-9

そして、私が得るものは次のとおりです。

0131123

さまざまな番号とさまざまな方法を試しsed 's/[^0-9]//g'ましたが、結果は常に 0131+my_number になります。理由はありますか?

アップデート

質問への回答

user@domain:/tmp$ grep number file.txt
number = 123;
user@domain:/tmp$ grep number file.txt | tr -dc 0-9
0131123user@domain:/tmp$ 
user@domain:/tmp$ grep number file.txt | sed 's/[^0-9]//g'
0131123
user@domain:/tmp$ cat file.txt 
number = 123;

ご覧のとおり、ファイルには 1 行しか含まれていません。

更新 2

antakGordon Davissonによって与えられたコマンドの結果

user@domain:/tmp$ grep number file.txt | cat -v
^[[01;31m^[[Knumber^[[m^[[K = 123;
user@domain:/tmp$ hexdump -C file.txt
00000000  6e 75 6d 62 65 72 20 3d  20 31 32 33 3b 0a        |number = 123;.|
0000000e

cat -vマジック 0131 が見えた後、どこから来たのかわかりません。

4

3 に答える 3

2

使用できますsed

sed -n 's/number = \(.*\);/\1/p' file.txt

またはgrepと友達と:

grep number file.txt | cut -d' ' -f3 | tr -d ';'

または(あなたが提案したように):

grep number file.txt | tr -dc 0-9

更新:元の回答を提供する前に、あなたの例を試しませんでした。あなたの例が私のために働いたと言いたかっただけです..(上記を参照)

于 2013-08-19T13:47:59.503 に答える
0

数値やその他のデータでも機能する、より一般的なソリューションを次に示します。

#!/bin/bash
FILENAME='file.txt'
SEARCH_PATTERN='number'

foundLine=$(grep -m 1 "$SEARCH_PATTERN" "$FILENAME")
if [[ $foundLine =~ =.*\; ]]; then
    value=$BASH_REMATCH
    value=$(echo "${value:1:-1}" | xargs) # remove = and ; and then trim
    echo "Your value is: _${value}_"
else
    echo 'Line not found :('
fi

これは非常に便利です。なぜなら、このコンテンツを含むファイルでは:

    number       =        'complex thing :3' ; # my comment with numbers 123 512
number = 'sadfhsah';

それは返さなければならない

Your value is: _complex thing :3_

したがって、コメントやその他のゴミの数字には依存しません。

PS 改行を含む変数や「;」を含むコメントでは機能しないことに注意してください。文字

于 2013-08-20T03:33:14.810 に答える