- 좋다grep을 사용하여 줄 끝의 패턴 감지, 그러나 DOS 파일의 CRLF 줄 종결자에는 사용됩니다.
- 그림https://unix.stackexchange.com/a/462633/374303, 한 가지 방법은 을 사용하는 것이지만
dos2unix
원격 서버에는 없습니다.
즉, 확장 정규식 모드에서는 작동하지 않습니까 \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 -P
grep
콘텐츠한 번에 한 줄(LF로 구분)이므로 정규식과 일치하는 문자열에서 LF를 찾을 수 없습니다.
pcregrep
그러나 Ultraline M
모드 에서는 사용할 수 있습니다 .
$ printf '%s\r\n' foo abcd bar | pcregrep -M '(*CRLF)d$' | sed -n l
abcd\r$
( sed -n l
CR을 로 표시 \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