programing

리눅스에서 Grep이 있는 DOS 줄 끝(CRLF)이 포함된 파일을 어떻게 검색합니까?

magicmemo 2023. 5. 11. 21:22
반응형

리눅스에서 Grep이 있는 DOS 줄 끝(CRLF)이 포함된 파일을 어떻게 검색합니까?

리눅스에서 grep으로 끝나는 도스 줄이 포함된 파일을 검색하고 싶습니다.이와 같은 것:

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

위의 내용이 문자 그대로 일치하는 것 같습니다.rn그것은 원하는 것이 아닙니다.

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

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

grep은 아마도 당신이 이것에 대해 원하는 도구가 아닐 것입니다.모든 파일에서 일치하는 모든 줄에 대한 줄이 인쇄됩니다.예를 들어, 10줄 파일에서 10번 실행을 원하지 않는 한 grep은 이 작업을 수행하는 가장 좋은 방법이 아닙니다.찾기를 사용하여 트리의 모든 파일에서 파일을 실행한 다음 "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

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

grep -IUr --color "^M"

작동할 것입니다 - 만약에^M제가 제안한 대로 당신이 입력하는 문자 그대로의 CR이 있습니다.

파일 목록을 원하는 경우 다음을 추가합니다.-l옵션도 마찬가지입니다.

설명.

  • -I이진 파일 무시
  • -Ugrep가 CR 문자를 제거하지 못하도록 합니다.기본적으로 텍스트 파일로 결정되면 이 작업을 수행합니다.
  • -r각 디렉터리의 모든 파일을 재귀적으로 읽습니다.

RipGrep 사용(셸에 따라 마지막 인수를 인용해야 할 수 있음):

rg -l \r
-l, --files-with-matches
Only print the paths with at least one match.

https://github.com/BurntSushi/ripgrep

사용 중인 grep 버전에서 -P(--perl-reggexp) 옵션을 지원하는 경우

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

dos2unix에는 변환할 파일을 표시하는 데 사용할 수 있는 파일 정보 옵션이 있습니다.

dos2unix -ic /path/to/file

재귀적으로 이 작업을 수행하려면 다음을 사용할 수 있습니다.bashglobstar현재 셸에 대해 사용할 수 있는 옵션shopt -s globstar:

dos2unix -ic **      # all files recursively
dos2unix -ic **/file # files called “file” recursively

또는 사용할 수 있습니다.find이를 위해:

find -type f -exec dos2unix -ic {} +            # all files recursively (ignoring directories)
find -name file -exec dos2unix -ic {} + # files called “file” recursively

unix에서 file 명령을 사용할 수 있습니다.파일의 문자 인코딩과 줄 바꿈 문자를 제공합니다.

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

쿼리는 검색...저도 비슷한 문제가 있어요...누군가가 버전 컨트롤에 혼합된 줄 끝을 제출했기 때문에 이제 우리는 많은 파일을 가지고 있습니다.0x0d 0x0d 0x0a선의 끝참고:

grep -P '\x0d\x0a'

모든 선을 찾습니다. 반면

grep -P '\x0d\x0d\x0a'

그리고.

grep -P '\x0d\x0d'

줄을 찾지 못해서 줄 끝 패턴과 관련하여 grep 내부에서 "잘못된" 것이 있을 수 있습니다.불행하게도!

저처럼 미니멀리스트 유닉스에 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

위의 내용을 수정하려면 다음과 같이 하십시오.

  • 검색할 파일만 찾도록 찾기 명령을 조정합니다.
  • dump 명령을 od 또는 사용 중인 파일 덤프 유틸리티로 변경합니다.
  • 명령에 덤프 유틸리티의 16진수 문자 출력뿐만 아니라 선행 및 후행 공백이 모두 포함되어 있는지 확인합니다.
  • 효율성을 위해 덤프 출력을 처음 1000자로 제한합니다.

예를 들어 덤프 대신 od를 사용하면 다음과 같은 작업을 수행할 수 있습니다.

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

언급URL : https://stackoverflow.com/questions/73833/how-do-you-search-for-files-containing-dos-line-endings-crlf-with-grep-on-linu

반응형