
У меня есть следующий 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$
Возможно, именно эти последовательности выхода и являются причиной проблемы.