it-gundan.com

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

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

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

위의 내용은 리터럴 rn와 일치하는 것 같습니다.

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

grep -IUrl --color '^M' . | xargs -ifile fromdos 'file'
113
Tim Abell

용도 Ctrl+VCtrl+M grep 문자열에 리터럴 캐리지 리턴 문자를 입력합니다. 그래서:

grep -IUr --color "^M"

작동합니다-^M 내가 제안한대로 입력 한 리터럴 CR이 있습니다.

파일 목록을 원하면 -l 옵션도 있습니다.

설명

  • -I 이진 파일 무시
  • -U grep이 CR 문자를 제거하지 못하게합니다. 기본적으로 텍스트 파일이라고 결정하면 수행됩니다.
  • -r 각 디렉토리 아래의 모든 파일을 재귀 적으로 읽습니다.
110
pjz

grep은 아마도 당신이 원하는 도구가 아닐 것입니다. 모든 파일에서 일치하는 모든 줄에 대한 줄을 인쇄합니다. 예를 들어, 10 줄 파일에서 todos를 10 번 실행하지 않는 한 grep이 가장 좋은 방법은 아닙니다. find를 사용하여 트리의 모든 파일에서 파일을 실행 한 다음 "CRLF"에 대해 파일을 가져 오면 스타일 줄 끝이있는 각 파일에 대해 한 줄의 출력이 표시됩니다.

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
143
Thomee
49
Steven Penny

Grep 버전이 -P (--Perl-regexp) 옵션을 지원하는 경우

grep -lUP '\r$'

사용 될수있다.

16
Linulin
# 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
7
yabt

검색어가 검색되었습니다 ... 비슷한 문제가 있습니다 ... 누군가 버전 컨트롤에 혼합 줄 끝을 제출 했으므로 이제 0x0d0x0d0x0a 줄 끝. 참고

grep -P '\x0d\x0a'

모든 줄을 찾는 반면

grep -P '\x0d\x0d\x0a'

grep -P '\x0d\x0d'

줄 끝 패턴을 찾을 때 grep 내부에 뭔가 "else"가있을 수 있습니다. 불행히도 저에게는 그렇지 않습니다!

3
Peter Y

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

$ file myfile
myfile: ISO-8859 text, with CRLF line terminators
$ file myfile | grep -ow CRLF
CRLF  
2

나와 같이 미니멀리스트 유닉스에 file 명령과 같은 멋진 기능이 포함되어 있지 않고 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

위의 내용을 수정하려는 경우 :

  • find 명령을 조정하여 스캔하려는 파일 만 찾습니다.
  • dump 명령을 od 또는 다른 파일 덤프 유틸리티로 변경하십시오.
  • cut 명령에 선행 및 후행 공백과 dump 유틸리티의 16 진 문자 출력이 모두 포함되어 있는지 확인하십시오.
  • 효율성을 위해 dump 출력을 처음 1000 자로 제한하십시오.

예를 들어, dump 대신 od를 사용하면 다음과 같이 작동합니다.

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