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 和正则表达式[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,以应对多场比赛(如果有的话)。

相关内容