При поиске в файлах с разделителями строк CRLF в Linux (особенно при использовании grep с подсветкой) можно столкнуться с неожиданным поведением: grep возвращает пустые строки, даже если должен находить совпадения. Это происходит из-за взаимодействия символа возврата каретки (
Проблема возникает, когда grep с включенной опцией
Существует несколько способов решения этой проблемы. Наиболее простой – преобразовать файл к использованию разделителей строк LF (Unix-style) с помощью утилиты
Подсветка в
Причина использования
\r
) с управляющими последовательностями терминала, используемыми для подсветки вывода. Изображение носит иллюстративный характер
Проблема возникает, когда grep с включенной опцией
--color
находит совпадение в файле с CRLF. Подсветка добавляет в вывод управляющие последовательности (escape-последовательности) для задания цвета и других атрибутов текста. В частности, последовательность \x1B[K
(EL – Erase Line) удаляет текст от курсора до конца строки. Символ \r
возвращает курсор в начало строки. Комбинация этих факторов приводит к тому, что подсветка, текст совпадения и символ возврата каретки оказываются в одной строке, после чего управляющая последовательность \x1B[K
стирает всю строку от начала до конца. Существует несколько способов решения этой проблемы. Наиболее простой – преобразовать файл к использованию разделителей строк LF (Unix-style) с помощью утилиты
dos2unix
. Если изменение файла невозможно, можно отключить подсветку в grep, используя опцию --color=never
. Также можно воспользоваться переменной окружения GREP_COLORS=ne
, которая отключает использование \x1B[K
и предотвращает стирание строки. Подсветка в
grep
автоматически отключается при перенаправлении вывода в другие команды (пайп), поэтому проблема исчезает. Причина использования
\x1B[K
в выводе grep с подсветкой связана с поддержкой легаси-терминалов и особых ситуаций, когда необходимо убедиться в отсутствии остаточного текста или некорректных цветовых атрибутов на строке.