我有ci管道,有很多before_scripts
部分。我想做一个多行正则表达式。我导出所有之前的脚本到my-ci-jobs.txt
与python脚本。
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
(]
- 字符]
文字(无需转义,因为字符类之外的]
并不特殊(。