Linux에서 grep을 사용하여 CRLF(dos 줄 끝)가 포함된 파일을 어떻게 검색합니까?

StackOverflow https://stackoverflow.com/questions/73833

  •  09-06-2019
  •  | 
  •  

문제

Linux에서 grep으로 끝나는 dos 줄이 포함된 파일을 검색하고 싶습니다.이 같은:

grep -IUr --color '\r\n' .

위의 내용은 리터럴과 일치하는 것 같습니다. rn 그것은 원하는 것이 아닙니다.

이것의 출력은 xargs를 통해 todos로 파이프되어 crlf를 lf로 변환합니다.

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
도움이 되었습니까?

해결책

사용 Ctrl 키+V, Ctrl 키+ grep 문자열에 리터럴 캐리지 리턴 문자를 입력합니다.그래서:

grep -IUr --color "^M"

작동합니다 - 만약 ^M 제가 제안한 대로 입력한 문자 그대로의 CR이 있습니다.

파일 목록을 원하면 -l 옵션도 그렇고.

설명

  • -I 바이너리 파일 무시
  • -U CR 문자를 제거하기 위해 grep을 방지합니다.기본적으로 텍스트 파일이라고 판단되면 이를 수행합니다.
  • -r 각 디렉토리 아래의 모든 파일을 재귀적으로 읽습니다.

다른 팁

grep은 아마도 당신이 원하는 도구가 아닐 것입니다.모든 파일에서 일치하는 모든 줄에 대해 한 줄을 인쇄합니다.예를 들어 10줄짜리 파일에 대해 todos를 10번 실행하고 싶지 않다면 grep이 최선의 방법은 아닙니다.find를 사용하여 트리의 모든 파일에 대해 파일을 실행한 다음 "CRLF"에 대해 검색하면 dos 스타일 줄 끝이 있는 각 파일에 대해 한 줄의 출력이 제공됩니다.

find . -not -type d -exec file "{}" ";" | grep CRLF

다음과 같은 결과를 얻을 수 있습니다:

./1/dos1.txt: ASCII text, with CRLF line terminators
./2/dos2.txt: ASCII text, with CRLF line terminators
./dos.txt: ASCII text, with CRLF line terminators

귀하의 grep 버전이 지원하는 경우 -P(--perl-regexp) 옵션, 그럼

grep -lUP '\r$'

사용 될수있다.

# list files containing dos line endings (CRLF)

cr="$(printf "\r")"    # alternative to ctrl-V ctrl-M

grep -Ilsr "${cr}$" . 

grep -Ilsr $'\r$' .   # yet another & even shorter alternative

검색어가 검색이었는데...비슷한 문제가 있습니다 ...누군가가 혼합 라인 엔딩을 버전 컨트롤에 제출 했으므로 이제 우리는 많은 파일이 있습니다. 0x0d 0x0d 0x0a 줄 끝.참고하세요

grep -P '\x0d\x0a'

모든 줄을 찾는 반면

grep -P '\x0d\x0d\x0a'

그리고

grep -P '\x0d\x0d'

줄을 찾을 수 없으므로 줄 끝 패턴에 관해서 Grep 내부에 "다른"것이있을 수 있습니다 ...나한테는 불행하게도!

나처럼 미니멀리스트 유닉스에 다음과 같은 세부 사항이 포함되어 있지 않다면 파일 명령 및 백슬래시 grep 표현식이 협조하지 않는 경우 다음을 시도해 보세요.

$ for file in `find . -type f` ; do
> dump $file | cut -c9-50 | egrep -m1 -q ' 0d| 0d'
> if [ $? -eq 0 ] ; then echo $file ; fi
> done

위 내용을 수정하려면 다음이 포함됩니다.

  • 조정하다 찾다 검사하려는 파일만 찾는 명령
  • 변경하다 덤프 명령하다 od 또는 어떤 파일 덤프 유틸리티를 사용하든지
  • 확인 자르다 명령에는 선행 및 후행 공백뿐만 아니라 16진수 문자 출력도 포함됩니다. 덤프 공익사업
  • 제한하다 덤프 효율성을 위해 처음 1000자 정도까지 출력합니다.

예를 들어, 이와 같은 것이 다음을 사용하여 작동할 수 있습니다. od 대신에 덤프:

 od -t x2 -N 1000 $file | cut -c8- | egrep -m1 -q ' 0d| 0d|0d$'

유닉스에서는 file 명령을 사용할 수 있습니다.줄 종결자와 함께 파일의 문자 인코딩을 제공합니다.

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top