【问题标题】: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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多