색상을 사용한 grep이 결과를 반환하지 않는 이유는 무엇입니까?

색상을 사용한 grep이 결과를 반환하지 않는 이유는 무엇입니까?

다음 파일이 있습니다 foo.txt.

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

나는 단어만으로 중간선을 파악 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

color 옵션과 함께 grep을 사용하면 터미널에 색상을 켜거나 끄도록 지시하는 추가 이스케이프 문자 시퀀스가 ​​생성되며 이러한 시퀀스는 올바르게 해석되지 않아 예상치 못한 결과가 발생할 위험이 있습니다.
grep의 출력을 캡처하여 이를 확인할 수 있습니다.

색깔이 없다

grep 출력을 다음으로 보냅니다.output.txt

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

화려한

옵션을 사용하여 색상을 강제합니다 --color=always. grep 출력을 리디렉션하면 가능하면 강조 표시한 정확한 이유로 색상이 꺼지고 이스케이프 문자는 부작용이 있을 수 있습니다.

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

이러한 이스케이프 시퀀스로 인해 문제가 발생할 수 있습니다.

관련 정보