색상을 사용해도 아무 것도 반환되지 않는 이유는 무엇입니까?

색상을 사용해도 아무 것도 반환되지 않는 이유는 무엇입니까?

다음 파일이 있습니다 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

색상 옵션과 함께 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$

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

관련 정보