Linux에서 grep을 사용하여 CRLF(dos 줄 끝)가 포함된 파일을 어떻게 검색합니까?
문제
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 -IUlr $'\r'
귀하의 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