我创建了一个需要与 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"