grep은 DOS 파일에서 줄 끝 패턴을 검색합니다.

grep은 DOS 파일에서 줄 끝 패턴을 검색합니다.

즉, 확장 정규식 모드에서는 작동하지 않습니까 \r? :grep

$ printf 'abcd\r\n' | grep -Ec 'd\r$'
0

$ printf 'abcd\r\n' | grep -c 'd.$'
1

$ printf 'abcd\r\n' | grep -Pc 'd\r$'
1

내 생각에는 \r확장 정규식의 일부인 것 같습니다. https://valelab4.ucsf.edu/svn/3rdpartypublic/boost/libs/regex/doc/html/boost_regex/syntax/basic_extended.html. 아니요?
아니면 정말 한계인가요 grep?

답변1

아니요, \r표준의 일부가 아닙니다.기초적인...도 아니다연장하다다음을 제외한 정규 표현식존재하다awk, 일부는 grep이를 확장으로 지원하지만(예: ast-open 및 기본 BRE grep사용) 모든 정규식 유형을 지원합니다 .-E-X-P

perl그러나 이는 PCRE 표현식뿐만 아니라 정규 표현식의 일부 이므로 grep.-P

대부분의 쉘은 이제 캐리지 리턴으로 확장되는 $'...'ksh93의 따옴표 형식을 지원합니다. \r따라서 이를 사용하여 다음을 수행할 수 있습니다.

grep $'d\r$'

(*LF)PCRE를 (*CRLF)사용하면 , 등의 지시문을 사용하여 줄 구분 기호 유형을 지정할 수 있지만 PCRE를 사용하여 Perl과 같은 일치를 구현하는 경우에도 사용할 수 없습니다 (*CR).grep -Pgrep콘텐츠한 번에 한 줄(LF로 구분)이므로 정규식과 일치하는 문자열에서 LF를 찾을 수 없습니다.

pcregrep그러나 Ultraline M모드 에서는 사용할 수 있습니다 .

$ printf '%s\r\n' foo abcd bar | pcregrep -M '(*CRLF)d$' | sed -n l
abcd\r$

( sed -n lCR을 로 표시 \r).

GNU를 사용하면 이를 플래그와 함께 사용하여 줄 대신 NUL로 구분된 레코드에서 작동하도록 grep할 수 있습니다 .-z

$ printf '%s\r\n' foo abcd bar | grep -oPz '(*CRLF)(?m).*d$' | tr '\0' '\n' | sed -n l
abcd$

(또한 Ultraline 플래그를 레코드의 끝과 더불어 각 줄의 끝에서 일치시키고 m출력에 표시하기 위해 NUL을 LF로 구문 분석할 수 있습니다.)$tr

관련 정보