2012-03-21 4 views
4

Неверные символы Grepping, похоже, не работают для возврата каретки (управляющий ключ^M).Grepping non printable characters by Cygwin

[email protected] ~ 
$ head -3 test.ctl 
row 1 
row 2 
row 3 
[email protected] ~ 
$ head -3 test.ctl | cat -nv 
    1 row 1^M 
    2 row 2^M 
    3 row 3 
[email protected] ~ 
$ head -3 test.ctl | grep '[^[:print:]]' 

[email protected] ~ 
$ head -3 test.ctl | grep '[[:cntrl:]]' 

[email protected] ~ 

ответ

5

Согласно человеко-странице grep, вы можете указать -U или --binary к:

Обработать файл (ы) в двоичном виде. По умолчанию в MS-DOS и MS-Windows grep угадывает файл , просматривая содержимое первых 32 КБ, считанных из файла. Если 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