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;

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

更新 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 回答
1

这是从你的grep --colour=always设置。设置后,默认情况下会将匹配的子字符串着色为红色(请参阅此处的详细信息),这将保存为^[[01;31m^[[K....^[[m^[[K标记,其中 ... 是匹配的子字符串。关闭--colour选项或更改使用--colour=auto,您将解决问题。

顺便说一句,我认为我应该对答案投赞成票:)

于 2015-05-04T18:15:11.080 回答
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 回答