我需要最终匹配以下任何一项:
AD-123, ad-123, AD123, and ad123
到目前为止,我拥有的是
| grep -oP 'AD-|ad-|AD|ad'[0-9]\+)
但这仅匹配字母并且完全忽略数字,我无法找出一种友好的方式来实现此目的。
上下文/用例:prepare-commit-msg githook,我想从分支名称中提取Jira票证并将其添加到任何提交消息中。可以使用功能/版本/股票代码关键字的分支命名约定(例如feature / 1.1.3 / ad-123-some-branch)
答案 0 :(得分:2)
您可以使用
| grep -oE "(AD|ad)[-']?[0-9]+"
这是一个与POSIX ERE(由于-E
选项相匹配)的正则表达式
(AD|ad)
-AD
或ad
(不是aD
或Ad
,因为您的要求不允许这样做)[-']?
-可选的-
或'
[0-9]+
-1个或更多数字可视化:
答案 1 :(得分:0)
[[
运算符(扩展测试)功能强大,足以进行此匹配,而无需使用任何第三方工具进行匹配。只需使用shopt
为不区分大小写的匹配启用一个选项,然后执行
shopt -s nocasematch
for word in AD-123 ad-123 AD123 ad123; do
if [[ $word == +(a|d)?(-)+([0-9]) ]]; then
echo "$word"
fi
done
默认情况下,在==
内使用[[
会使用bash
模式匹配中的extglob
option。如果您不想设置忽略大小写选项,请
[[ $word == +([Aa]|[Dd])?(-)+([0-9]) ]]