由Cygwin打印不可打印的字符

时间:2012-03-21 10:58:47

标签: bash shell cygwin grep non-printable

对不可打印的字符进行限制似乎不适用于回车(控制键^ 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 ~

1 个答案:

答案 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