bash中不可见的0131数字
我正在尝试使用bash从文件中收集数字。我的文件如下所示:bash中不可见的0131数字,bash,sed,tr,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:/tm
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
和给出的命令的结果
在
cat-v
之后,我可以看到magic 0131,但我不知道它来自哪里。您可以使用sed
:
sed -n 's/number = \(.*\);/\1/p' file.txt
或者与grep和朋友一起:
grep number file.txt | cut -d' ' -f3 | tr -d ';'
或者(如你所建议的):
更新:在给出原始答案之前,我没有尝试过你的例子。我只是想说你的例子对我有用。。(如上图所示)这里有一个更通用的解决方案,它也适用于数字和其他数据:
#!/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_
因此,它不依赖于评论和其他垃圾中的数字
请注意,它不适用于包含换行符的变量和包含“;”的注释字符来自您的
grep--color=始终
设置。设置后,默认情况下,它将用红色为匹配的子字符串上色(请参见详细信息),并将其另存为^[[01;31m^[[K…^[[m^[[K
标记,其中…是匹配的子字符串。关闭--color
选项或更改为使用--color=auto
,您将解决此问题
顺便说一句,我想我应该为答案投上一票:)是否
file.txt
还有任何其他行包含number
?没有。number在这个文件中是唯一的。当我尝试这个时,我得到了“123”,正如人们所期望的那样。我不明白你为什么会遇到这个问题……我怀疑“0131”前缀是由脚本的另一部分生成的。我也有同样的问题结果为@roky。如果只执行第一部分,会发生什么情况:grep number file.txt
?这些是ANSI或VT100转义序列。您可能使用类似cat>file.txt
的内容创建了该文件,并尝试在键入时使用光标键进行编辑。同样使用grep
,这一部分也有效:grep-Po'(?@fedorqui Nice one!:)@fedorqui不适用于大多数GREP,因为它们是perl正则表达式。为什么使用颜色?我在原始问题中没有看到任何提到颜色的内容。因为默认情况下,对于任何匹配的子字符串,GREP\u color
设置为mt=1;31
(红色粗体)(请参阅详细信息)。我猜原始海报可能设置了grep--color=always
,这样它会在grep输出中隐藏颜色代码(显示为红色,但显示为^[[01;31m^[[Knumber^[[m^[[K
,在他的情况下,通过cat-v
)。乞求业力/选票是不好的形式。(不过,你有我的投票权,这是一个好答案).谢谢.这是我在这里获得的第一个名声。
number = 'complex thing :3' ; # my comment with numbers 123 512
number = 'sadfhsah';
Your value is: _complex thing :3_