리눅스에서 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
이진 파일 무시-U
grep가 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
재귀적으로 이 작업을 수행하려면 다음을 사용할 수 있습니다.bash
의globstar
현재 셸에 대해 사용할 수 있는 옵션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
'programing' 카테고리의 다른 글
postgres를 사용하여 string_agg와 같이 array_agg의 null 값을 제외하는 방법은 무엇입니까? (0) | 2023.05.16 |
---|---|
Windows에서 MongoDB에 연결하는 방법은 무엇입니까? (0) | 2023.05.11 |
OWIN 카타나는 언제 사용해야 하나요? (0) | 2023.05.11 |
PostgreSQL에 없는 경우 열을 추가하는 방법은 무엇입니까? (0) | 2023.05.11 |
C# 속성 속기에 해당하는 VB.NET? (0) | 2023.05.11 |