regex - grep:-Pz 不支持未转义的 ^ 或 $

标签 regex bash shell grep

我想知道为什么在新版本的 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/

相关文章:

r - 如何提取所有内容直到模式第一次出现

linux - 无效的压缩数据——违反格式?

linux - 使用 shell 脚本杀死 vim 进程会留下 .swp 文件

python - 如何从终端运行 FastAPI?

linux - 用于在每小时文件夹中移动日志文件的脚本

php - 如何确定一个字符串是否是 PHP 中的数学语句?

regex - 使用 egrep 在 bash 中查找被空格包围的行中的字符

java - 什么时候值得在 Java 中使用 RegEx?

Linux 从任何地方执行 CASA

bash - ubuntu 中的 Vim 无法识别我的环境变量