grep 命令在使用 -Pz 时不支持开始 '^' 和 '$' 行尾锚点

αғs*_*нιη 4 grep bugs

参考这个关于 AU 的问答

为什么 GNUgrep使用-Pz参数的行为发生了变化并且不支持行首^$行尾锚点?

这是错误还是正确的行为?

在内核版本为 4.4.0-21-generic 的 Ubuntu 16.04 上测试。

$ echo ^ | grep -Pz ^
grep: unescaped ^ or $ not supported with -Pz
Run Code Online (Sandbox Code Playgroud)

cuo*_*glm 5

这是 GNU grep 2.24 版(2016 年 3 月 10 日发布)及更高版本的预期行为,这是对 GNU grep 2.5 中引入的错误的修复。

查看源代码

if (*p == '$' || (*p == '^' && !after_unescaped_left_bracket))
  die (EXIT_TROUBLE, 0,
       _("unescaped ^ or $ not supported with -Pz"));
Run Code Online (Sandbox Code Playgroud)

此更改于 2016 年 2 月 21 日进行,有关此更改的更多详细信息,请参阅此错误报告


虽然这是GNU grep的选择,这是一个错误,因为GNU的grep编译PCRE正则表达式与PCRE_MULTILINE,并也收归同时呼吁多个记录pcre_exec,这是问题的根源,如指出,斯特凡Chazelas

  • 耻辱,听起来像是对错误问题的错误(非)修复。`grep` 正在使用 PCRE_MULTILINE 调用 `pcre_compile`,这首先是问题的根源 AFAICT(如 https://debbugs.gnu.org/cgi/bugreport.cgi?bug=16871#8 所述) (3认同)
  • [我已经要求重新打开错误](https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22655#47) (2认同)
  • @KasiyA,它现在在最新的开发版本(git head)中得到了正确修复。Cuong,它不像使用 PCRE_MULTILINE 那样简单,而且 GNU grep 已经恢复到一次调用 pcre_exec 多个记录。有关更多详细信息,请参阅 [bug 讨论](https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22655#47)。我很遗憾错过了故事的最新部分。 (2认同)