Grep이 DOS 형식 텍스트 파일에서 줄 끝을 찾을 수 없습니까?

Grep이 DOS 형식 텍스트 파일에서 줄 끝을 찾을 수 없습니까?

Ubuntu에서는 원래 Windows에서 생성된 다음 소스 제어에 제출된 C 파일을 작업하고 있습니다. Vim표시된 파일 형식은 "dos"입니다. 제가 수집한 내용은 CR/LF줄 끝이 있다는 의미입니다. grepfind regex 를 사용하여 파일의 함수 정의 목록을 가져오려고 하는데 ')$'아무 것도 반환하지 않습니다. 파일 형식을 "unix"( :set ff=unixin vim) 로 변경하면 grep예상대로 작동했습니다.

이것은 버그입니까, 아니면 줄 끝이 grep공식적으로 지원되지 않습니까 ? CR/LF나는 페이지에서 이것을 찾았습니다 man:

-U --binary 파일을 바이너리로 처리합니다. 기본적으로 MS-DOS 및 MS-Windows에서 grep은 --binary-files 옵션에 설명된 대로 파일이 텍스트인지 바이너리인지 추측합니다.grep이 파일이 텍스트 파일이라고 판단하면 원래 파일 내용에서 캐리지 리턴을 제거합니다(^ 및 $를 사용한 정규 표현식이 제대로 작동하도록 하기 위해).-U를 지정하면 이 추측이 무시되어 모든 파일을 읽고 일치하는 메커니즘에 그대로 전달됩니다. 이렇게 하면 파일이 각 줄 끝에 CR/LF 쌍이 있는 텍스트 파일인 경우 일부 정규식이 실패하게 됩니다. 이 옵션은 MS-DOS 및 MS-Windows 이외의 플랫폼에는 영향을 미치지 않습니다.

하지만 그것은 말한다MS-DOS 및 MS-Windows에서이전 문장에 나와 있는데 여기에도 해당되는지 모르겠습니다.

다른 정규 표현식이 있나요?~해야 한다일치 CR/LF또는 다른 명령줄 옵션이 grep도움이 되지 않는 것 같나요? 아니면 동료의 파일을 다시 포맷하여 많은 커밋 소음을 발생시키는 것이 실제로 나에게 유일한 솔루션입니까?

답변1

Windows 및 DOS 텍스트 파일의 경우 각 줄 끝에 추가 캐리지 리턴이 있습니다. 이는 정규 표현식 )$아니요각 줄에는 추가 캐리지 리턴 문자도 있으므로 모든 줄과 일치합니다.

)캐리지 리턴으로 끝나는 줄을 일치시키려면 )[[:space:]]$as 표현식을 사용하세요. 이 [[:space:]]비트는 캐리지 리턴을 포함하여 단일 "공백과 유사한 문자"와 일치합니다.

grep당신 은 또한단어표현식의 캐리지 리턴의 경우 예를 들어 $')\r$'표현식의 매개변수 문자열로 사용합니다. 일부 셸에서는 $'...'셸이 이스케이프 시퀀스(예: 등)를 \tC 프로그래밍 언어로 표시되는 실제 문자로 확장하는 "C 문자열"입니다.\r\n

의 일부 변형은 grep표현식을 \s일치하는 캐리지 리턴으로 인식합니다(보다 이식성이 뛰어난 에서처럼 [[:space:]]).

Unix 시스템에서 이러한 파일을 사용하려는 경우 가장 쉬운 방법은 질문에서 언급한 방법(Vim 편집기에서 Unix 텍스트 파일로 저장)을 사용하여 파일을 Unix 텍스트 파일로 변환하는 것입니다. .convert와 같은 도구를 사용합니다 dos2unix.


"MS-DOS 및 MS-Windows에서"라는 텍스트는 grep특정 운영 체제에서 실행된다는 의미입니다. Ubuntu를 사용하고 있으므로 이는 적용되지 않습니다.

관련 정보