4

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 ~
4

1 回答 1

5

根据grep手册页,您可以指定-U--binary

将文件视为二进制文件。默认情况下,在 MS-DOS 和 MS-Windows 下,grep通过查看从文件中读取的前 32KB 的内容来猜测文件类型。如果 grep 确定文件是文本文件,它会从原始文件内容中删除 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
于 2012-03-21T11:26:48.583 回答