由Cygwin打印不可打印的字符

inz*_*zzz 4 bash shell grep cygwin non-printable

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 ~
Run Code Online (Sandbox Code Playgroud)

rua*_*akh 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
Run Code Online (Sandbox Code Playgroud)