Почему поиск по цвету ничего не возвращает?

Почему поиск по цвету ничего не возвращает?

У меня есть следующий foo.txtфайл:

This is the first line.
This is the middle line.
This is the last line.

И я пытаюсь выполнить grep только по слову middleи вернуть окружение (в качестве примера), чтобы можно было выделить все предложение (что особенно полезно при использовании с опцией контекста).

Этоделаетработа без цвета:

$ grep -o --color=none '.\+ middle .\+' foo.txt
This is the middle line.

Но та же командане делаетработа с цветом:

$ grep -o --color=auto '.\+ middle .\+' foo.txt
(empty line)

Примечание: Без -oэтого не имеет значения.

Хотя это работает при фильтрации только первой половины строки:

$ grep -o --color=auto '.\+ middle' foo.txt
This is the middle

но не со второй половиной ( 'middle .\+').

Почему это не работает так, как ожидалось, и как это исправить? Это ошибка или я не могу использовать два регулярных выражения одновременно по какой-то причине?


Протестировано на OS X с:

$ grep --version
grep (BSD grep) 2.5.1-FreeBSD

Хотя на Linux это вроде бы работает, поэтому я в замешательстве.

решение1

Когда вы используете grep с параметрами цвета, он создает дополнительные последовательности символов escape, которые сообщают терминалу, что нужно включить или выключить цвет, эти последовательности представляют риск неправильной интерпретации и получения неожиданных результатов.
Вы можете просмотреть их, захватив вывод grep

Без цвета

отправить вывод greps наoutput.txt

% grep -o --color=none '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt 
This is the middle line.$

С цветом

Принудительное использование цвета с помощью --color=alwaysпараметра. Если вы перенаправите вывод greps, он, если это возможно, отключит цвет именно по той причине, которую вы выделили, символы экранирования могут вызывать побочные эффекты.

% grep -o --color=always '.\+ middle .\+' foo.txt > output.txt
% cat -etv output.txt                                             
^[[01;31m^[[KThis is the middle line.^[[m^[[K$

Возможно, именно эти последовательности выхода и являются причиной проблемы.

Связанный контент