개행 후 pcregrep 어설션 오류가 발생합니까?

개행 후 pcregrep 어설션 오류가 발생합니까?

pcregrep빈 줄 다음에 첫 번째 줄을 인쇄 해 보세요 . 예를 들어 파일의 내용은

first line

second line

인쇄 해야 해요 second line. 다음은 항상 동일한 정규식을 사용하는 몇 가지 테스트입니다.

파이썬 2.7 사용

python -c "import re; print re.search(r'(?<=\n\n).*?$',\
    open('file').read(), re.MULTILINE).group()"
second line

GNU grep 2.16 사용

grep -oPz  '(?<=\n\n).*?$' file
second line

pcregrep 버전 8.12 사용

pcregrep -Mo  '(?<=\n\n).*?$' file
(no output)

일부 테스트에 따르면, pcregrep뒤돌아보기 어설션은 일반적으로 지원되지만, 뒤돌아보기 어설션 내부의 상황을 구체적으로 처리할 수 있는 방법은 없는 것 같습니다 \n. \n미리보기 어설션 내부에는 문제가 없습니다.

RHEL 및 Ubuntu에서 테스트되었습니다. 어떤 아이디어가 있나요?

답변1

pcregrep분명히 찾고 싶은 개행 유형을 지정할 수 있습니다 . 스위치는 -NPCRE 모드를 사용할 때 이 작업을 수행합니다.

-N newline-type, --newline=newline-type PCRE 라이브러리는 줄 끝 표시를 위한 5가지 다른 규칙을 지원합니다. 여기에는 단일 문자 시퀀스 CR(캐리지 리턴) 및 LF(줄 바꿈), 두 문자 시퀀스 CRLF, 이전 세 가지 유형 중 하나를 인식하는 "anycrlf" 규칙, 그리고 다음과 같은 "any" 규칙이 있습니다. 유니코드 줄 끝이 가정됩니다. 시퀀스는 줄에서 끝납니다. 유니코드 시퀀스는 방금 언급한 세 가지에 VT(세로 탭, U+000B), FF(폼 피드, U+000C), NEL(다음 줄, U+0085), LS(줄 구분 기호), U+2028을 더한 것입니다. ) 및 PS(단락 구분 기호, U+2029).

PCRE 라이브러리가 빌드되면 기본 줄 끝 순서가 지정됩니다. 이는 일반적으로 운영 체제의 표준 순서입니다. 이 옵션을 별도로 지정하지 않는 한 pcregrep은 라이브러리의 기본값을 사용합니다. 이 옵션에 가능한 값은 CR, LF, CRLF, ANYCRLF 또는 ANY입니다. 이렇게 하면 줄 끝을 수정하지 않고도 pcregrep을 사용하여 다른 환경의 파일을 검색할 수 있습니다. 스캔되는 데이터가 이 옵션으로 설정된 규칙을 따르지 않으면 pcregrep이 이상하게 작동할 수 있습니다. 이 옵션은 운영 체제의 표준 개행 시퀀스를 사용할 것으로 예상되는 -f, --exclude-from 또는 --include-from 옵션으로 지정된 파일에는 적용되지 않습니다.

$ pcregrep -Mo  -N CRLF '(?<=\n\n).*?$' sample.txt 
second line

$

기타 이상한 행동

흥미롭게도 후시에서 전방시로 변경하면 다음이 생성됩니다.

$ pcregrep -Mo  '(?>\n\n).*?$' sample.txt 


second line
$

관련 정보