2017-09-20 9 views
0

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 수없는 이유를 을 이해할 필요가있다.

+0

'(? s)'를 처음에 추가하거나'.'를'[\ s \ S]'로 대체하십시오. PCRE regex에서'.'는 기본적으로 줄 바꿈 기호와 일치하지 않으며's' 수정자는 POSIX와 같은 도트 비헤이비어를 활성화합니다. –

+0

@ WiktorStribiżew 끝까지 신중하게 질문을 읽어주십시오. 나는 "왜 GREP가 '\ n \ n \ n'패턴을 이해할 수 없었는가?"라고 분명하게 묻습니다. –

+0

컴퓨터는 아무 것도 이해할 수 없습니다. 엔진이 문자열과 일치하는지 여부. PCRE 정규 표현식에서'.'는'\ n'과 일치하지 않습니다. –

답변

1

PCRE 정규식에서 .은 기본적으로 줄 바꿈 기호와 일치하지 않으며 s 수정자는 도트 동작과 같은 POSIX를 사용합니다.

따라서 처음에 (?s)을 추가하거나 .[\s\S]으로 대체하십시오.

(?s)^########## Ligand Number :\s+\d+.+?\n\n\n 
+0

당신 말이 맞아요. 문제는 '\ n \ n \ n'패턴을 분석하는 것이 아니라 내부 '.'구문을 분석/이해/일치시키는 것입니다. '\ n'. –