Regex 使用egrep正则表达式捕获部分行

Regex 使用egrep正则表达式捕获部分行,regex,bash,Regex,Bash,我正试图通过bash脚本提交git补丁。这不是一个愚蠢的问题!这是我想做的,我有一个目录中的文件列表。我想一个接一个地读取这些文件,从中提取一行,然后提交。 这是我到目前为止得到的 patches=/{location}/*.patch for patch in $patches do echo "Processing $patch file..." git apply $patch git add --all git commit -m | egrep -o "(^Subjec

我正试图通过bash脚本提交git补丁。这不是一个愚蠢的问题!这是我想做的,我有一个目录中的文件列表。我想一个接一个地读取这些文件,从中提取一行,然后提交。 这是我到目前为止得到的

patches=/{location}/*.patch for patch in $patches do echo "Processing $patch file..." git apply $patch git add --all git commit -m | egrep -o "(^Subject: \[PATCH [0-9]\/[0-9]\].)(.*)$" $f echo "Committed $patch file..." done 补丁=/{location}/*.patch 对于$patches中的补丁 做 echo“正在处理$patch文件…” git应用$patch git add--all git commit-m|egrep-o“(^Subject:\[PATCH[0-9]\/[0-9]\])(.*)$”$f echo“提交的$patch文件…” 完成 无法使egrep正则表达式工作以传递正确的提交消息。 下面是补丁文件中的一行示例

..... Subject: [PATCH 1/3] XSR-2756 Including ldap credentials in property file. ...... ..... 主题:[修补程序1/3]XSR-2756,包括属性文件中的ldap凭据。 ......
我只想捕获“XSR-2756,包括属性文件中的ldap凭据”,并将其用作对git的提交描述。

在这种情况下,不要将
-o
用于egrep(因为您匹配了一堆不希望打印的内容)。相反,只需匹配整行并将其管道化为“cut”(或sed,或其他将从一行中修剪前缀的内容)

此外,您正在将git commit的输出管道化到egrep中,而不是将egrep的输出作为git commit的命令行选项提供。。。我想你想要的是:

git commit -m "$(egrep '<your regexp here>' $f | cut -d] -f2-)"
git提交-m“$(egrep”$f | cut-d]-f2-”

假设您有GNU grep,请使用Perl查找:

git commit -m "$(grep -Po '(?<=Subject: \[PATCH \d/\d\].).*') $patch"
git commit-m“$(grep-Po)”(?

git commit -m | sed -r -n 's#^Subject: \[PATCH [0-9]/[0-9]\] ##p;'

同意。如果您不使用GNU grep,请使用awk代替
awk'{print gensub(/(^Subject:\[PATCH\d/\d\])(.*$/,“\\2”,“g”)}
awk'{sub(/^Subject:\[PATCH\d\/\d\]./,”);print}
稍微简单一点。