Гриппинг непечатных символов Cygwin

Похоже, что перебор непечатных символов не работает для возврата каретки (управляющая клавиша ^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 ответ

Решение

Согласно grep man-страницу, вы можете указать -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
Другие вопросы по тегам