1

我有 ci-pipelines 并且有很多before_scripts部分。我想做一个多行正则表达式。我将所有之前的脚本导出到my-ci-jobs.txtpython 脚本。

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_script 和第一个匹配之间的所有内容],。但是当我实现它时,它会捕捉到最长的匹配。这是我的命令(我不会在这里传递结果,它是整个文件直到最后一个],):

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

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

4

1 回答 1

2

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

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

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

如果您只需要第一场比赛,请添加| head -1

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

图案细节

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