我想知道为什么在新版本的 grep (Ubuntu 16.04) 中我的 bash 脚本停止工作:
...
COMMIT_REGEX='^\[[A-Z]+-[0-9]+\] \s*\S+(?:.|\n|\r)*\s* \(review: ([a-z]+\.[a-z]+|MYSELF)\)$'
if ! grep -Paz "$COMMIT_REGEX" "$1"; then
...
我得到“grep: unescaped ^ or $ not supported with -Pz”。我试图转义 ^ 和 $ 符号,但没有帮助。
在 Ubuntu 15.10 脚本中完美运行。
最佳答案
看来问题是bug with grep -Pz
的结果(感谢 Lars Fischer 以查找相关报告)。
我建议放弃 -P
开关并使用 -E
代替:
commit_re='^\[[A-Z]+-[0-9]+\] \s*\S+(.|\n|\r)*\s* \(review: ([a-z]+\.[a-z]+|MYSELF)\)$'
if ! grep -qEaz "$commit_re" "$1"; then
我所做的唯一更改是将 -P
更改为 -E
并添加 -q
(安静)开关,因为您只对返回码感兴趣。您真的不需要非捕获组,所以我将其更改为普通组。
我也不喜欢看到 ALL_CAPS 变量名,因为它们实际上应该保留给 shell 使用。
关于regex - grep:-Pz 不支持未转义的 ^ 或 $,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37618736/