【问题标题】:Grepping non printable characters by CygwinCygwin 抓取不可打印的字符
【发布时间】:2012-03-21 10:58:46
【问题描述】:
Grepping 不可打印字符似乎不适用于回车(控制键 ^M)。
usr@R923047 ~
$ head -3 test.ctl
row 1
row 2
row 3
usr@R923047 ~
$ head -3 test.ctl | cat -nv
1 row 1^M
2 row 2^M
3 row 3
usr@R923047 ~
$ head -3 test.ctl | grep '[^[:print:]]'
usr@R923047 ~
$ head -3 test.ctl | grep '[[:cntrl:]]'
usr@R923047 ~
【问题讨论】:
标签:
bash
shell
cygwin
grep
non-printable
【解决方案1】:
根据grep 手册页,您可以指定-U 或--binary 为:
将文件视为二进制文件。默认情况下,在 MS-DOS 和 MS-Windows 下,grep 猜测文件
通过查看从文件中读取的前 32KB 的内容来键入。如果grep 决定
file 是一个文本文件,它会从原始文件内容中去除 CR 字符(使
带有^ 和$ 的正则表达式可以正常工作)。指定 -U 会推翻这种猜测,
导致所有文件被逐字读取并传递给匹配机制;如果文件是
每行末尾带有 CR/LF 对的文本文件,这将导致一些正则表达式
失败。此选项对 MS-DOS 和 MS-Windows 以外的平台无效。
所以:
$ head -3 test.ctl
row 1
row 2
row 3
$ head -3 test.ctl | cat -nv
1 row 1^M
2 row 2^M
3 row 3
$ head -3 test.ctl | grep '[^[:print:]]'
$ head -3 test.ctl | grep '[[:cntrl:]]'
$ head -3 test.ctl | grep -U '[^[:print:]]'
row 1
row 2
$ head -3 test.ctl | grep -U '[[:cntrl:]]'
row 1
row 2