我想从压缩合并GitHub PR产生的提交消息字符串中提取Jira ID。如果存在多个Jira ID,我想提取第一个。
如何使用bash regex、sed、grep、groovy或任何其他可用的comman line工具?
测试用例:
ABCD-1231 dummy title XYZ-566 (#423)
=> ABCD-1231
[ABCD-1232, XYZ-566] dummy title (#424)
=> ABCD-1232
[ABCD-1233] dummy title (#425)
=> ABCD-1233
ABCD-1234: dummy title (#426)
=> ABCD-1234
XYZ-567 dummy title (#427)
=> XYZ-567
(XYZ-568) dummy title (#428)
=> XYZ-568
"XYZ-569" dummy title (#429)
=> XYZ-569
dummy title XYZ-570 dummy title (#430)
=> XYZ-570
DUMMY title XYZ-571 dummy title (#431)
=> XYZ-571
'feature/XYZ-572' dummy title (#432)
=> XYZ-572
FEATURE|XYZ-573 dummy title (#433)
=> XYZ-573
<Feature\XYZ-574> dummy title (#434)
=> XYZ-574
dummy title FAKE-XYZ-575 dummy title (#435)
=> <nothing>
dummy title abcdXYZ-576 dummy title (#436)
=> <nothing>
在巴什,"[^A-Z]*(([A-Z]+-[0-9]+)*.*) \(#([0-9]+)\)"
会失败
- “特色|XYZ-573虚拟标题(#433)”
- “[功能\XYZ-574]虚拟标题(#434)”
- ...
而bash似乎不支持如下的负向后看:".*[^A-Z]*((?<!([A-Z]+)-?)[A-Z]+-[0-9]+).*"
有人能提出解决方案或正确的工具来完成这项任务吗?
1条答案
按热度按时间oprakyz71#
您可以尝试使用
-P
选项在grep
上启用 PCRE 引擎。这可能取决于服务器上的grep
版本。它会让你使用lookarounds。你也可以使用
-m 1
选项来限制匹配行,但是这对我们没有太大帮助,因为提交消息都在一行上。我将使用它只是为了防止您的提交消息在几行上。这可以保存几个CPU周期。-o
选项将只输出匹配项。然后,我们可以将输出传递给head
,以便只进行第一个匹配。对于模式,我会尝试使用
(?<=^|[^\w-])[A-Z]+-\d+
。我已经使用了一个积极的向后查找来匹配行的开头或者任何不是单词或连字符的字符。我在下面的bash脚本中测试了所有的提交消息:
编辑
谢谢你,@InSync,你聪明的解决方案没有使用
head
,而是使用 PCRE 的\K
模式来重置报告匹配的起点。它用于以一种不贪婪的方式消耗第一个Jira ID之前的所有字符。我已经把它添加到B)点下的上面的批次中。输出,A)和B):