我要做的是使用我通过CI过程获得的证书名称egrep
搜索子句来查找该证书的代码签名标识。执行搜索的代码如下所示:
SIGN_IDENTITY="iPhone Distribution: My Great Company, INC. (Alphanumeric_Here)"
CODE_SIGN_IDENTITY=`security find-identity -v -p codesigning | egrep "\d\d?\)\s[a-zA-Z0-9]{40}\s\"${SIGN_IDENTITY}\""`
security find-identity -v -p codesigning
返回值如下所示:
1) code_signing_id_40_alphanumeric "iPhone Distribution: My Company (alphanumeric)"
2) code_signing_id_40_alphanumeric "iPhone Developer: My Company (alphanumeric)"
如图所示,SIGN_IDENTITY
可以包含)
或.
等字符,这些字符是正则表达式中的特殊字符,需要替换为\)
(或者在这种情况下\\)
1}})。我做了一些搜索,以找出是否有其他人有类似的问题,如果有一个功能完成这项工作,但找不到任何东西。
我也是Bash的新手。寻找现有函数或将SIGN_IDENTITY
正则表达式相关字符替换为字符串文字的方法。
建议并可以使用的一种方法如下:
CODE_SIGN_IDENTITY=`security find-identity -v -p codesigning | grep -F "${SIGN_IDENTITY}"`
但我很想知道是否有办法逃避SIGN_IDENTITY
中的特殊字符并将其用作正则表达式模式的一部分。
答案 0 :(得分:4)
# a shell function using sed to escape POSIX BRE (Basic Regular Expressions)
bre_escape() { sed 's/[.[\*^$]/\\&/g'; }
# ...and an example of its use:
sign_identity="iPhone Distribution: My Great Company, INC. (Alphanumeric_Here)"
sign_identity_re=$(bre_escape <<<"$sign_identity")
code_sign_identity=$(security find-identity -p codesigning | grep -e "$sign_identity_re")
请注意,bre_escape
适用于BRE - 普通grep
,而不是egrep
或grep -E
或grep -P
。