나는 리눅스를 사용한다. 수천 개의 구성 파일에 숨겨진 성가신 ^ M (Windows 캐리지 리턴)이 있으며 서버가 실패하기 때문에 찾아야합니다.
구성 파일로 가득 찬 디렉토리 계층에서 ^ M을 어떻게 찾을 수 있습니까?
bash 명령 줄에 ^ M을 입력 할 수 없다고 생각합니다. 하지만 m.txt라는 텍스트 파일에 있습니다.
나는 리눅스를 사용한다. 수천 개의 구성 파일에 숨겨진 성가신 ^ M (Windows 캐리지 리턴)이 있으며 서버가 실패하기 때문에 찾아야합니다.
구성 파일로 가득 찬 디렉토리 계층에서 ^ M을 어떻게 찾을 수 있습니까?
bash 명령 줄에 ^ M을 입력 할 수 없다고 생각합니다. 하지만 m.txt라는 텍스트 파일에 있습니다.
답변:
grep -r $'\r' *
Bash에서 -r
재귀 검색 및 $''
c 스타일 이스케이프에 사용하십시오 .
또한 텍스트 파일인지 확실하다면 실행하는 것이 안전해야합니다.
tr -d $'\r' < filename
\r
파일에서 모두 제거 합니다.
GNU를 사용하는 경우 sed
, -i
현재 위치에서 편집을 수행 할 수 있습니다, 그래서 당신은 다시 쓸 필요가 없습니다 :
sed $'s/\r//' -i filename
$'\r'
.
$'
은 맨 페이지에서 첫 번째 히트를 읽습니다. bash(1)
기본적으로 C 리터럴 문자열을 쓰는 것처럼 볼 수 있습니다. 에 관해서 command < filename
의 사용 <
또는 >
라고 리디렉션 이 나는 사람이 그것을라고 보았다 처음이다, 더 큰 표현 . 검색 REDIRECTION
에서 bash(1)
.
서버에 bash 쉘이없는 경우, -f
옵션 grep
은를 포함하는 준비된 파일과 함께 on 옵션 을 사용 하는 것 \r
입니다.
파일을 만들려면
$ echo -ne '\r' > /tmp/cr --or-- $ printf '\r' > /tmp/cr
$ od -c /tmp/cr
0000000 \r
0000001
실제로 검색하려면
$ grep -f /tmp/cr *.html *.php *.asp *.whatever
아니면 조금 게으르고 * 만 입력해도됩니다.
$ grep -f /tmp/cr *
옵션에는 한 줄에 하나와 일치하는 패턴을 포함하는 파일을 지정하는 데 사용됩니다. 이 경우 하나의 패턴 만 있습니다.-f filename
grep
귀하의 질문을 올바르게 이해하면 실제로 원하는 것은 모든 줄 끝을 Unix LF ( \x0a
) 표준 으로 정규화하는 것입니다. 맹목적으로 CR을 제거하는 것과는 다릅니다 ( \x0d
).
줄 바꿈에 CR 만 사용하는 Mac 파일이있는 경우 해당 파일을 파괴합니다. (예, Mac은 거의 20 년 동안 LF를 사용해야하지만 2019 년에는 여전히 CR 만 사용하는 많은 Mac 앱이 있습니다).
Perl의 줄 바꿈 \R
이스케이프 를 사용 하면 모든 줄 바꿈을로 바꿀 수 \n
있습니다.
perl -i.bak -pe 's/\R/\n/g' $your_file
그러면 원본 파일의 백업이에 유지 되면서 모든 종류의 줄 바꿈이 \n
in로 대체 $your_file
됩니다 ${your_file}.bak
.
Mac을 사용 중이고 homebrew를 사용하는 경우 다음 을 수행 할 수 있습니다.
brew install tofrodos
fromdos file.txt
file.txt 에서 모든 Windows 캐리지 리턴을 제거하는 방법
Windows 캐리지 리턴으로 다시 전환하려면
todos file.txt
정규 표현식 스타일에서 다양한 줄 바꿈 :
윈도우 (CR LF)
\r\n
유닉스 (LF)
\n
때문에 \r\n
순서가 매우 독특합니다, 나는 당신이 그것을 그런 식으로 검색 할 수 있어야한다고 생각?
설상가상으로 Mac은 줄 바꿈 대신 '\ r'을 사용했습니다. 나는 이것을 확인할 수 없지만 MacOSX 세대가 더 이상 그렇게 생각하지 않습니다.
이전 맥 (CR)
\r
grep "\r\n" *
에는 결과가 없습니다. 중 하나에 대한 검색 결과가 없습니다 egrep -e "\r\n" *
도grep -E "\r\n" *
\r
내 나쁜 CR 만 의미했다 . 전체 창 줄 바꿈은 참으로 \r\n
또는 CRLF