^ M이 포함 된 파일을 찾으려면 grep (Windows 캐리지 리턴)


72

나는 리눅스를 사용한다. 수천 개의 구성 파일에 숨겨진 성가신 ^ M (Windows 캐리지 리턴)이 있으며 서버가 실패하기 때문에 찾아야합니다.

구성 파일로 가득 찬 디렉토리 계층에서 ^ M을 어떻게 찾을 수 있습니까?

bash 명령 줄에 ^ M을 입력 할 수 없다고 생각합니다. 하지만 m.txt라는 텍스트 파일에 있습니다.



창은 ^ M ^ J 일 것입니다
barlop

3
"bash 명령 줄에 ^ M을 입력 할 수 없습니다". 그래 넌 할수있어. control-V Control-M 시도
Hennes

답변:


91
grep -r $'\r' *

Bash에서 -r재귀 검색 및 $''c 스타일 이스케이프에 사용하십시오 .

또한 텍스트 파일인지 확실하다면 실행하는 것이 안전해야합니다.

tr -d $'\r' < filename

\r파일에서 모두 제거 합니다.

GNU를 사용하는 경우 sed, -i현재 위치에서 편집을 수행 할 수 있습니다, 그래서 당신은 다시 쓸 필요가 없습니다 :

sed $'s/\r//' -i filename

10
@Nicolas : ^ V ^ M을 눌러 명령 행에 ^ M을 입력 할 수 있지만을 사용하는 것이 좋습니다 $'\r'.
Dennis Williamson

잘 작동합니다! ^ V ^ M 트릭도 감사합니다 :-)
Nicolas Raoul

5
Cygwin에서이 작업을 수행하려면 -U가 필요합니다. 그렙 -r -U -n -e $ '\ R': 그리고 -n 당신에게 줄 수 말할 것이다
라이너 Blome

4
grep 명령에 -l을 추가하여 파일 이름 만보십시오. 그렇지 않으면 일치하는 줄로 폭격을 당할 수도 있습니다.
Brendan Byrd

1
@uprego는 지금 이해하는지 확실하지 않지만 fyi 및 기타의 검색 $'은 맨 페이지에서 첫 번째 히트를 읽습니다. bash(1)기본적으로 C 리터럴 문자열을 쓰는 것처럼 볼 수 있습니다. 에 관해서 command < filename의 사용 <또는 >라고 리디렉션 이 나는 사람이 그것을라고 보았다 처음이다, 더 큰 표현 . 검색 REDIRECTION에서 bash(1).
livibetter

12

내가 시도했을 때, 그것은 일종의 작동이라고 말할 수 있었지만 줄이 공백으로 인쇄되고있었습니다. 옵션에 추가하십시오 :

--color=never

이 문제가 발생하면 문자를 방해하는 색상 강조 표시의 이스케이프 문자라고 생각합니다 \r.


2

서버에 bash 쉘이없는 경우, -f옵션 grep은를 포함하는 준비된 파일과 함께 on 옵션 을 사용 하는 것 \r입니다.

파일을 만들려면

$ echo -ne '\r' > /tmp/cr                    --or--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r
0000001

실제로 검색하려면

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

아니면 조금 게으르고 * 만 입력해도됩니다.

$ grep -f /tmp/cr *

옵션에는 한 줄에 하나와 일치하는 패턴을 포함하는 파일을 지정하는 데 사용됩니다. 이 경우 하나의 패턴 만 있습니다.-f filenamegrep


2

귀하의 질문을 올바르게 이해하면 실제로 원하는 것은 모든 줄 끝을 Unix LF ( \x0a) 표준 으로 정규화하는 것입니다. 맹목적으로 CR을 제거하는 것과는 다릅니다 ( \x0d).

줄 바꿈에 CR 만 사용하는 Mac 파일이있는 경우 해당 파일을 파괴합니다. (예, Mac은 거의 20 년 동안 LF를 사용해야하지만 2019 년에는 여전히 CR 만 사용하는 많은 Mac 앱이 있습니다).

Perl의 줄 바꿈 \R 이스케이프 를 사용 하면 모든 줄 바꿈을로 바꿀 수 \n있습니다.

perl -i.bak -pe 's/\R/\n/g' $your_file

그러면 원본 파일의 백업이에 유지 되면서 모든 종류의 줄 바꿈이 \nin로 대체 $your_file됩니다 ${your_file}.bak.


1

줄 끝 문자에 grep을 사용하려면 grep에게 파일이 이진 파일이라고 말해야합니다.

-l (문자 L)은 파일 이름 만 인쇄합니다.

-P는 perl regexp를위한 것이므로 \ x0d는 \ r 또는 ^ M으로 변환됩니다.

grep -l --binary -P '\x0d' *

0

Mac을 사용 중이고 homebrew를 사용하는 경우 다음 을 수행 할 수 있습니다.

brew install tofrodos
fromdos file.txt

file.txt 에서 모든 Windows 캐리지 리턴을 제거하는 방법

Windows 캐리지 리턴으로 다시 전환하려면

todos file.txt

폴더를 검색하고 dos에서 오는 모든 파일을 정리하려면 다음 명령을 실행하십시오. find. -type f -name "* .java"| xargs fromdos
Taiko

0

정규 표현식 스타일에서 다양한 줄 바꿈 :

윈도우 (CR LF)
\r\n

유닉스 (LF)
\n

때문에 \r\n순서가 매우 독특합니다, 나는 당신이 그것을 그런 식으로 검색 할 수 있어야한다고 생각?

설상가상으로 Mac은 줄 바꿈 대신 '\ r'을 사용했습니다. 나는 이것을 확인할 수 없지만 MacOSX 세대가 더 이상 그렇게 생각하지 않습니다.

이전 맥 (CR)
\r


m.txt가 포함 된 디렉토리 grep "\r\n" *에는 결과가 없습니다. 중 하나에 대한 검색 결과가 없습니다 egrep -e "\r\n" *grep -E "\r\n" *
니콜라스 라울

@ nicolas 아, 오해 .. 당신은 \r내 나쁜 CR 만 의미했다 . 전체 창 줄 바꿈은 참으로 \r\n또는 CRLF
제프 앳 우드

0

이전 답변에 이어 'tr'방법이 좋습니다.

533 $ if [[-n " tr -cd "\r" <~/.bashrc"]]; 그런 다음 "DOS"를 에코하십시오. else echo "UNIX"; fi

유닉스

534 $ if [[-n " tr -cd "\r" <dosfile.txt"]]; 그런 다음 "DOS"를 에코하십시오. else echo "UNIX"; fi

도스

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.