pcregrep 如何强制 return 正则表达式的第一场比赛

How pcregrep force to return first match of regexp

我有 ci 管道并且有很多 before_scripts 部分。我想制作一个多行正则表达式。我使用 python 脚本将所有脚本导出到 my-ci-jobs.txt

pcregrep -M 'before_script.*\n.*' my-ci-jobs.txt 
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"
"before_script": [
    "yarn install"

这工作正常,但有时,在脚本之前有更多的行,所以我想做一个正则来捕获 before_script 和 ], 的第一个匹配之间的所有内容。但是当我实现它时,它会捕捉到最长的匹配。这是我的命令(我不会在这里传递结果,它是整个文件直到最后 ],):

pcregrep -M 'before_script.*(\n|.)*],' my-ci-jobs.txt

如何使正则表达式匹配第一个匹配项?有没有更好的方法来做多行正则表达式?

你几乎不需要在正则表达式中使用 (.|\n),有更好的方法来匹配任何字符,包括换行符。

要匹配任何零个或多个字符但 ] 您可以使用 [^]]* 模式:

pcregrep -M 'before_script[^]]*]' file

如果您只需要第一个匹配项,请添加 | head -1:

pcregrep -M 'before_script[^]]*]' file | head -1

图案详情

  • before_script - 一些文字
  • [^]]* - 一个否定的括号表达式,它匹配除 ] 字符之外的任何字符,0 次或更多次,尽可能多(因为 * 是一个贪婪的量词)(它也匹配换行符,因为您将 -M 选项传递给 pcregrep)
  • ] - 文字 ] 字符(不需要转义它,因为字符 class 之外的 ] 并不特殊)。