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 删除。
正如@Kusalananda 所解释的,问题出'
在正则表达式内部。一个简单的解决方案是使用"
正则表达式,因为"
即使在"
-quoted 字符串'
中也可以转义,不像不能在'
-quoted 字符串中转义:
grep -rPoh "(?<=(?<!def )my_method )([\"'])(?:(?=(\\?))\2.)*?\1"
Run Code Online (Sandbox Code Playgroud)