在grep

时间:2017-01-04 22:19:38

标签: bash shell

我要做的是使用我通过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中的特殊字符并将其用作正则表达式模式的一部分。

1 个答案:

答案 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,而不是egrepgrep -Egrep -P