如何查找文件中的控制字符?

如何查找文件中的控制字符?

我想找到我的文件中有哪些控制字符。我不搜索特定字符,但有可能\t\n。我有一个程序告诉我:Invalid control character。但当我打开文件时,我看不到任何东西。如何展现这些人物形象呢?我怀疑\nor\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 以字节数报告它们。

相关内容