正则表达式正确的 Grep 语法错误

正则表达式正确的 Grep 语法错误

我创建了一个需要与 grep 一起运行的正则表达式,我很确定该正则表达式很好,因为它可以与在线正则表达式工具配合使用,但是当我运行时

grep -r -P -o -h '(?<=(?<!def )my_method )(["'])(?:(?=(\\?))\2.)*?\1'

我得到了错误Syntax error: ")" unexpected

答案1

您的正则表达式用单引号引起来,但它也包含单引号。

中的单引号["']需要转义,否则它将向 shell 发出带引号的字符串结束的信号。

这将修复它:

grep -r -P -o -h '(?<=(?<!def )my_method )(["'\''])(?:(?=(\\?))\2.)*?\1'
#                                            ^^^^

使用 时["'\''],第一个'结束字符串的第一部分,\'插入一个文字单引号,最后一个'开始一个新的单引号字符串,该字符串将与前面的位连接。只有中间的单引号会出现在正则表达式本身中,其他两个单引号将被 shell 删除。

答案2

正如@Kusalananda解释了,问题出在'正则表达式内部。一个简单的解决方案是使用"正则表达式,因为"即使在带引号的字符串内也可以转义"'这与不能在带引号的字符串内转义不同'

grep -rPoh "(?<=(?<!def )my_method )([\"'])(?:(?=(\\?))\2.)*?\1"

相关内容