我有以下文件。
//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 和正则表达式[runscript]
获取之间的文本。[/runscript]
我已经验证正则表达式可以独立工作。
(?<=\[runscript\]\n)(.|\n)*(?=\[\/runscript\])
然而,grep 什么也不返回。是选项的问题吗?我单独或组合尝试了其中的许多方法。
-P、-e、-E、-w、-o
我缺少什么?
答案1
grep
一次只处理一行,因此正则表达式匹配的内容永远不会包含换行符。
由于您想使用 perl/PCRE 运算符,因此您可以使用pcregrep
具有多行模式的 和-M
,可以被告知报告匹配的一部分:
pcregrep -xMo1 '(?s)\[runscript\]\n(.*?)\n\[/runscript]'
或者:
pcregrep -xMo1 '(?s)\[runscript\]\r?\n(.*?)\n\[/runscript]\r?'
允许 MS-DOS 风格的 CRLF 行分隔符(此处,如果输入中存在 CR,则 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,以应对多场比赛(如果有的话)。