GREP를 사용하여 파일에서 여러 줄 레코드를 선택하려고합니다.GREP에서 여러 n 문자를 사용할 수없는 이유
기록은 내가 펄 정규식 (-P)를 사용하고 그
########## Ligand Number : 1
blab bla bla
bla blab bla
########## Ligand Number : 2
blab bla bla
bla blab bla
########## Ligand Number : 3
bla bla bla
<EOF>
같은 모양.
GREP에서 여러 줄 제한을 우회하려면 grep -zo를 사용합니다. 이렇게하면 파서는 여러 줄을 소비하고 내가 원하는 것을 정확히 출력 할 수 있습니다. 일반적으로 잘 작동합니다.
그러나 여기서 문제는 마지막 레코드 줄 끝에서 세 줄의 빈 줄 (끝에 세 줄의 '\ n'문자 : 끝 줄의 줄과 두 개의 빈 줄 두 줄)이있는 빈 줄입니다.
내가
grep -Pzo '^########## Ligand Number :\s+\d+.+?\n\n\n' inputFile
는 아무 것도 반환하지 않습니다 같은 표현을 사용하려고
. grep은 연속적인 '\ n'문자를 허용하지 않습니다.아무도 설명을 드릴 수 있습니까?
P. 나는 '\ n'문자를 '\ a'로 먼저 번역 한 후 다시 번역함으로써 그것을 우회했다. 이 다음 예와 같이 :
cat inputFile | tr '\n' '\a' | grep -Po '########## Ligand Number :\s+\d+\a.+?\a\a\a' | tr '\a' '\n'
하지만는 '\ n \ n \ n'을 패턴을 이해 GREP 수없는 이유를 을 이해할 필요가있다.
'(? s)'를 처음에 추가하거나'.'를'[\ s \ S]'로 대체하십시오. PCRE regex에서'.'는 기본적으로 줄 바꿈 기호와 일치하지 않으며's' 수정자는 POSIX와 같은 도트 비헤이비어를 활성화합니다. –
@ WiktorStribiżew 끝까지 신중하게 질문을 읽어주십시오. 나는 "왜 GREP가 '\ n \ n \ n'패턴을 이해할 수 없었는가?"라고 분명하게 묻습니다. –
컴퓨터는 아무 것도 이해할 수 없습니다. 엔진이 문자열과 일치하는지 여부. PCRE 정규 표현식에서'.'는'\ n'과 일치하지 않습니다. –