Гриппинг непечатных символов 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