如何强制返回regexp的第一个匹配

如何强制返回regexp的第一个匹配,regex,bash,pcregrep,Regex,Bash,Pcregrep,我有ci管道,在脚本之前有很多部分。我想做一个多行regexp。我使用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":

我有ci管道,在脚本之前有很多
部分。我想做一个多行regexp。我使用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脚本中有更多的行,所以我想做一个常规脚本,它捕获before_脚本和第一个匹配的
之间的所有内容。但当我实现它时,它将赶上最长的比赛。这是我的命令(我不会在这里显示结果,直到最后一个
],
,它是整个文件):


如何使regexp与第一个匹配项匹配?有没有更好的方法来执行多行regexp?

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

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

pcregrep -M 'before_script[^]]*]' file
如果只需要第一个匹配项,请添加
| head-1

pcregrep -M 'before_script[^]]*]' file | head -1
图案细节

  • 在脚本之前
    -一些文字
  • [^]]*
    -一个反括号表达式,匹配除
    ]
    字符以外的任何字符,尽可能多地匹配0次或更多次(因为
    *
    是一个贪婪的量词)(它也匹配换行字符,因为您将
    -M
    选项传递给
    pcregremp
  • ]
    -文字
    ]
    字符(无需转义,因为字符类之外的
    ]
    并不特殊)

感谢您的重播。这是行不通的。它什么也不返回。有用吗?我编辑了正则表达式。如果您提供上述输入的预期结果,这将有所帮助。也许你可以创建一个文件的小样本并粘贴。这很有效,谢谢。你能解释一下reqexp并回答我的问题吗?我想你只需要在脚本[^]]*]文件
之前使用
pcregrep-M'。如果您只需要第一次匹配,请添加
|head-1
我需要在脚本之前的
的第一次匹配,
但基本上我需要在脚本之前的所有
,然后检查差异。你的第一个要求完全符合我的要求。
pcregrep -M 'before_script[^]]*]' file | head -1