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)로 파이프하십시오.