grep --color=auto ^M이 색상 일치 내에 있으면 중단됩니다.

grep --color=auto ^M이 색상 일치 내에 있으면 중단됩니다.

The quick brown fox jumps\n over the lazy dog.텍스트의 줄 끝이 다른 2개의 유사한 파일(dos.txt 및 unix.txt)이 있습니다 . 줄 끝에서 단어를 검색하면 dos.txt의 출력이 비어 있습니다.

$ grep -E 'jumps^M?$' dos.txt unix.txt

unix.txt:The quick brown fox jumps

Grep이 뭔가를 찾았지만 인쇄하지는 않습니다. grep의 실제 출력은 다음과 같습니다.

$ grep -E --color=always 'jumps^M?$' dos.txt unix.txt | cat -v
^[[35m^[[Kdos.txt^[[m^[[K^[[36m^[[K:^[[m^[[KThe ... ^[[01;31m^[[Kjumps^M^[[m^[[K
^[[35m^[[Kunix.txt^[[m^[[K^[[36m^[[K:^[[m^[[KThe ... ^[[01;31m^[[Kjumps^[[m^[[K

따라서 유일한 차이점은 ^M이 컬러 출력 내부에 있고 전체 줄이 사라지게 한다는 것입니다. dos2unix 또는 유사한 도구를 사용하여 dos 파일을 변환하지 않고 이 문제를 어떻게 해결할 수 있습니까?

답변1

이스케이프 시퀀스를 검색한 후 ^[[K나는 다음과 같은 책을 반 권 읽었습니다.VT100 터미널확인해보니 man grep환경 변수를 GREP_COLORS다음과 같이 설정한 것으로 나타났습니다.

GREP_COLORS=ne

원하는 출력을 제공합니다.

$ export GREP_COLORS=ne
$ grep -E --color=always 'jumps^M?$' dos.txt unix.txt
dos.txt:The quick brown fox jumps
unix.txt:The quick brown fox jumps

$ grep -E --color=always 'jumps^M?$' dos.txt unix.txt | cat -v
^[[35mdos.txt^[[m^[[36m:^[[mThe ... ^[[01;31mjumps^M^[[m
^[[35munix.txt^[[m^[[36m:^[[mThe ... ^[[01;31mjumps^[[m

grep매뉴얼 페이지 에서 :

ne     Boolean  value  that prevents clearing to the
       end of line using Erase in Line (EL) to Right
       (\33[K)  each  time  a  colorized  item ends.
       This is needed on terminals on  which  EL  is
       not  supported.   It  is  otherwise useful on
       terminals  for  which  the   back_color_erase
       (bce)  boolean  terminfo  capability does not
       apply, when the chosen  highlight  colors  do
       not  affect the background, or when EL is too
       slow or causes too much flicker.  The default
       is false (i.e., the capability is omitted).

제 경우에는 하이라이트 색상을 설정하여 배경색을 변경해도 잘 작동했습니다.

export GREP_COLORS="ne:mt=41;38"

이제 흥미로운 질문은 왜 ^[[K이 빈 줄이 생성되는지입니다.

문자는 ^M다음 줄로 이동하지 않고 캐리지 리턴을 나타냅니다.

$ echo -e "start^Mend"
endrt

^[[K커서 오른쪽에 있는 줄을 지우고 나머지 줄을 씁니다.

$ echo -e "start\033[Kend"
startend

^M그러나 앞에 넣으면 ^[[K내용이 제거됩니다.

$ echo -e "start^M\033[Kend"
end

글을 쓴 후시작커서가 줄의 시작 부분으로 이동한 다음 ^[[K모든 내용이 삭제되고 나머지 줄이 기록됩니다. grep출력의 첫 번째 줄이 모든 것을 단어에 쓰는 경우도약, 그런 다음 줄의 시작 부분으로 돌아가서 ^M무해한 ^[[m시퀀스를 쓴 ^J다음 새 줄로 이동합니다. 그렇기 때문에 전체 행을 지운 후입니다 ^[[K.^M

답변2

tr(1)을 통해 출력을 파이프하고 캐리지 리턴을 제거할 수 있습니다. tr -d '\r'모든 캐리지 리턴이 제거됩니다.

이것은 작동합니다:

grep --color=always -E 'jumps' dos.txt unix.txt | tr -d '\r'

( 에도 적용됩니다 ^M?.)

팁: 출력에 안전하지 않은 문자가 포함될 수 있다고 의심되는 경우 출력을 less(1)로 파이프하십시오.

관련 정보