Linux 文本中的不可见字符和处理
同事提供了一个接口,我通过curl调用,然后将返回结果写入到文件,然后用grep和sed处理这个文件。用浏览器和curl打开的时候,都是正常的,返回的都是
inetis_p1,masterpool;inetis_p2,masterpool;inetis_q1,masterpool;inetis_q2,masterpool;inetis_t1,masterpool;inetis_t2,masterpool;
但写入文件之后,用grep和sed处理的时候,总是说这是一个二进制文件
[root@linuxidc script]# grep master /var/tmp/qiehuan145.txt
匹配到二进制文件 /var/tmp/qiehuan145.txt
很奇怪,用vim打开之后,发现是这样的
inetis_p1,masterpool^@^@^@^@^@^@;inetis_p2,masterpool^@^@^@^@^@^@;inetis_q1,masterpool^@^@^@^@^@^@;inetis_q2,masterpool^@^@^@^@^@^@;inetis_t1,masterpool^@^@^@^@^@^@;inetis_t2,masterpool^@^@^@^@^@^@;
里面多了很多的不可见的字符^@
用cat -A也能看到
[root@linuxidc script]# cat -A /var/tmp/qiehuan145.txt
inetis_p1,masterpool^@^@^@^@^@^@;inetis_p2,masterpool^@^@^@^@^@^@;inetis_q1,masterpool^@^@^@^@^@^@;inetis_q2,masterpool^@^@^@^@^@^@;inetis_t1,masterpool^@^@^@^@^@^@;inetis_t2,masterpool^@^@^@^@^@^@;$
像这种不可见字符,用printf可以输出到文件中,比如:
printf 'test\011\011\011I am testing\014\010\012more testing' > /tmp/test.txt
如果用cat查看
[root@linuxidc script]# cat /tmp/test.txt
test I am testing
more testing[root@linuxidc script]#
如果用cat -A查看
[root@linuxidc script]# cat -A /tmp/test.txt
test^I^I^II am testing^L^H$
more testing[root@linuxidc script]#
现在说一下我是怎么解决的
cat -A /var/tmp/qiehuan145.txt |sed 's/[\^@]//g'
先用cat -A读取,然后用sed替换,不过需要注意到是^需要转义