여러 줄 grep - 이 표현에 어떤 문제가 있나요?

여러 줄 grep - 이 표현에 어떤 문제가 있나요?

다음 예제 파일을 고려하십시오(행 번호는 참조용일 뿐입니다).

1 Reference duiarneutdigane uditraenturida enudtiar.
2
3 Reference uiae uiaetrtdnsu iatdne uiatrdenu diaren uidtae
4 on line 23.
5
6 uiae
7
8 uaiernd Reference uriadne udtiraeb unledut iaeru uilaedr
9 uiarnde line 234.

이 grep 명령(tst는 예제 파일)을 사용하여 "Reference"로 시작하고 마침표로 끝나는 모든 문자열(예: ll.1, 3–4 및 8–9)을 일치시키고 싶습니다.

grep -P '(?s)Reference.*?\.' tst

그러나 첫 번째 행에만 일치합니다. 나는 무엇을 생각하고 있습니까?

  • (?s), .개행 문자를 포함한 모든 문자와 일치합니다.
  • .*?별표는 탐욕스럽지 않게 만들어져서 마침표로 끝나는 경우 전체 파일과 일치하지 않습니다.
  • 표현식은 마침표로 끝나야 합니다 \..

-z나는 또한 awk와 grep의 플래그를 시도했지만 두 가지 방법을 모두 사용하여 모든 줄을 얻거나 모든 줄이 내 표현과 일치하지 않습니다.

답변1

다음을 사용할 수 있습니다.

grep -Pzo '(?s)Reference.*?\.' tst.txt

tst.txt입력 파일은 어디에 있습니까? 정규식과 동일하지만 두 개의 새로운 플래그가 있습니다.

-z줄 끝에서 줄바꿈을 억제하고 이를 null 문자로 바꾸는 플래그를 추가했습니다 . 따라서 grep줄의 끝이 어디에 있는지 알지만 입력을 하나의 큰 줄로 처리합니다.

-o플래그는 일치하는 부분만 인쇄한다는 의미입니다.

다음과 같은 결과가 나타납니다.

Reference duiarneutdigane uditraenturida enudtiar.
Reference uiae uiaetrtdnsu iatdne uiatrdenu diaren uidtae
on line 23.
Reference uriadne udtiraeb unledut iaeru uilaedr
uiarnde line 234.

관련 정보