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

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

参考AU 的问答

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

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

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

$ echo ^ | grep -Pz ^
grep: unescaped ^ or $ not supported with -Pz

答案1

这是 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"));

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


虽然这是 GNU grep 选择,但它是一个错误,因为 GNU grepPCRE_MULTILINE使用set编译 PCRE 正则表达式, 和还恢复为一次调用 pcre_exec 处理多个记录,这是问题的根源,正如所指出的经过斯蒂芬·查泽拉斯

相关内容