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

use*_*239 2 grep regular-expression

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

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

我收到错误Syntax error: ")" unexpected

Kus*_*nda 10

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

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

这将修复它:

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

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

  • 好棘手的方法。替代方法:`(["\x27])` 可以正常工作(用它的 ascii 代码替换单引号) (3认同)

ter*_*don 5

正如@Kusalananda 所解释的,问题出'在正则表达式内部。一个简单的解决方案是使用"正则表达式,因为"即使在"-quoted 字符串'中也可以转义,不像不能在'-quoted 字符串中转义:

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