CLI에서 정규식을 사용하는 Grep은 아무것도 반환하지 않습니다.

CLI에서 정규식을 사용하는 Grep은 아무것도 반환하지 않습니다.

다음 파일이 있습니다.

//TESTCASES=3
//MARK=9

[runscript]
nc dec s10 s11
[/runscript]

[checks]

[/checks]

[testcase]
// List: 1, 2, 3, 5, 0xA, -1
.global LIST
.data
LIST: 
.word 1, 2, 3, 5, 0xA, -1
[/testcase]

grep 과 regex 사용 [runscript]사이에 텍스트를 가져오려고 합니다.[/runscript]

정규식이 독립적으로 작동하는지 확인했습니다.

(?<=\[runscript\]\n)(.|\n)*(?=\[\/runscript\])

그러나 grep은 아무것도 반환하지 않습니다. 옵션의 문제인가요? 나는 이러한 접근 방식 중 많은 것을 개별적으로 또는 조합하여 시도했습니다.

-P, -e, -E, -w, -o

내가 무엇을 놓치고 있나요?

답변1

grep한 번에 한 줄만 처리되므로 정규식과 일치하는 내용에는 개행 문자가 포함되지 않습니다.

perl/PCRE 연산자를 사용하고 싶기 때문에 일치 항목의 일부를 보고하도록 지시할 수 있는 pcregrep여러 줄 패턴과 함께 sum을 사용할 수 있습니다.-M

pcregrep -xMo1 '(?s)\[runscript\]\n(.*?)\n\[/runscript]'

또는:

pcregrep -xMo1 '(?s)\[runscript\]\r?\n(.*?)\n\[/runscript]\r?'

MS-DOS 스타일 CRLF 줄 구분 기호를 허용합니다(여기서 CR이 입력에 있으면 출력에도 포함됩니다).

답변2

나는 grep대신 사용하지 않을 것입니다 awk:

awk '
    $0=="[runscript]" {rs++; next}
    $0=="[/runscript]" {rs--}
    rs {print}
' file

산출

nc dec s10 s11

실제로 사용하려는 경우 grepPCRE 및 NUL 구분 데이터와 함께 작동합니다 . 하지만 이 awk버전은 사람들이 이해(및 유지)하기가 더 어렵고 이식하기도 더 어렵다고 제안합니다 .

grep -zoP '(?<=\[runscript\]\n)(.|\n)*?(?=\[\/runscript\])' file

출력(표시되지 않는 후행 NUL 포함)

nc dec s10 s11

여러 게임(있는 경우)을 처리하도록 RE를 조정했습니다.

관련 정보