我正在尝试使用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
给出的命令结果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,但我不知道它来自哪里。
答案 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。请注意,它不适用于包含换行符且包含';'的注释的变量字符