我想找到我的文件中有哪些控制字符。我不搜索特定字符,但有可能\t
或\n
。我有一个程序告诉我:Invalid control character
。但当我打开文件时,我看不到任何东西。如何展现这些人物形象呢?我怀疑\n
or\t
或 一些添加空格的字符。
我尝试过:grep '\n' myfile.txt
但在输出中它标记了该n
字母。
答案1
寻找特定字符
grep
并且sed
不支持控制字符的反斜杠表示法。 (sed
正则表达式使用反斜杠反向引用.) 如果您正在使用bash
它在传递给这些(或任何)程序之前可以将反斜杠序列转换为实际的控制字符:
$ grep $'\t' file
$ sed -n /$'\t'/p file
$ # or change to l (ell) to visibly show the control character(s)
$ sed -n /$'\t'/l file
OTOHawk
确实可移植地支持这种表示法:
$ awk '/\t/' file
寻找任何控制字符
grep
和都sed
可以搜索补足字符类/范围,它将找到包含以下内容的行任何不是“可打印”(图形或空格)ASCII 字符的字符。 (文件中分隔行的换行符不被视为在行,因此不满足此匹配。但是,如果您有一个带有 Windows 或 telnet/SMTP/etc 样式 CRLF 的文件,则 CR将要每行都匹配,使该技术不太有用。)
$ export LANG=C # use an ASCII or at least single-byte locale; this is the simplest one
$ grep '[^ -~]' file
$ sed -n '/[^ -~]/p' file
$ # or better (see below)
$ sed -n '/[^ -~]/l' file
到展示除了控制字符之外,整个文件或选定的行中还存在哪些控制字符SHawarden 给出的选项您还可以使用:
$ sed -n l [file] # that's ell not one; can merge into the selection as above
$ cat -vT [file]
$ # both read stdin if not given a filename
$ # and thus can be piped from a selection command above
请注意,其中一些显示至少使用反斜杠表示法一些字符(\t
=制表符,\b
=退格键),而其他人则使用“插入符”(在古代是“向上箭头”)表示法(^I
=制表符,^H
=退格键)。请参阅任何 ASCII 图表以了解对应关系,请注意脱字符号/向上箭头表示减去或加上十六进制 40(等于八进制 100)。
答案2
要查看该字符是什么:
less sourcefile
或者
od -c sourceFile
以获得更详细的视图。
答案3
如果它是关于 json 数据(json
已知 python 的包会报告该错误消息),您可以通过以下方式识别哪个 json 字符串中包含控制字符:
perl -Mcharnames=:full -C -l -0777 -ne '
while (/"(?:\\.|[^"])*"/g) {
my $offset = $-[0];
my $string = $&;
@ctrl = map {charnames::viacode(ord($_))} $string =~ /\p{PosixCntrl}/g;
if (@ctrl) {
print "Offset: $offset, String: $string, Ctrl: ". join "+", @ctrl
}
}' file.json
此处的示例file.json
文件:
$ python -c 'import json; import os; print(json.load(file("file.json")))'
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/usr/lib/python2.7/json/__init__.py", line 291, in load
**kw)
File "/usr/lib/python2.7/json/__init__.py", line 339, in loads
return _default_decoder.decode(s)
File "/usr/lib/python2.7/json/decoder.py", line 364, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "/usr/lib/python2.7/json/decoder.py", line 380, in raw_decode
obj, end = self.scan_once(s, idx)
ValueError: Invalid control character at: line 1 column 22 (char 21)
上面的代码perl
返回:
Offset: 19, String: "a b
c", Ctrl: CHARACTER TABULATION+LINE FEED
你可以看到Python抱怨的控制字符是该字符串开始后的TAB一、2个字符"..."
。请注意,perl
以字符数报告异地,而 python 以字节数报告它们。