bash中隐形的0131号码

时间:2013-08-19 13:45:00

标签: bash sed tr

我正在尝试使用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;

正如您所看到的,文件除了一行之外不包含任何内容。

更新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,但我不知道它来自哪里。

2 个答案:

答案 0 :(得分: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

更新:在给出原始答案之前,我没有尝试过您的示例。只是想说你的例子对我有用..(你在上面看到)

答案 1 :(得分: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_

所以它不依赖于评论和其他垃圾中的数字。

P.S。请注意,它不适用于包含换行符且包含';'的注释的变量字符