다음 파일이 있습니다.
//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
실제로 사용하려는 경우 grep
PCRE 및 NUL 구분 데이터와 함께 작동합니다 . 하지만 이 awk
버전은 사람들이 이해(및 유지)하기가 더 어렵고 이식하기도 더 어렵다고 제안합니다 .
grep -zoP '(?<=\[runscript\]\n)(.|\n)*?(?=\[\/runscript\])' file
출력(표시되지 않는 후행 NUL 포함)
nc dec s10 s11
여러 게임(있는 경우)을 처리하도록 RE를 조정했습니다.