对不可打印的字符进行限制似乎不适用于回车(控制键^ 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 ~
答案 0 :(得分:5)
根据grep
手册页,您可以指定-U
或--binary
:
将文件视为二进制文件。默认情况下,在MS-DOS和MS-Windows下,
grep
会猜到该文件 通过查看从文件中读取的第一个32KB的内容来键入。如果grep
决定 file是一个文本文件,它从原始文件内容中剥离CR字符(make^
和$
正则表达式正常工作)。指定-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