将 ripgrep 与包含文字美元符号的正则表达式一起使用

将 ripgrep 与包含文字美元符号的正则表达式一起使用

假设我有一个包含类似内容的脚本

VAR=${VAR1%.*}

我正在寻找类似的命令

rg "${.*%"

想要找到它,但我无法靠近。

所有这些都失败了

rg "\$\{.\*%"
rg \$\{.\*%
rg "\$\{.*%"
rg \$\{.*%

答案1

$,\对于正则表达式和 shell 来说是特殊的(包括后者的双引号内)。{在某些上下文中,对于 shell 来说也是特殊的,其列表随 shell 的不同而变化。

事实上,许多正则表达式运算符(*?|{}()\^$[至少])在 shell 语法中也很特殊(一些无论如何 shell),因此最好将正则表达式括在单引号内,在大多数 shell 中,所有字符都会失去其特殊含义(如果有)。

所以:

rg '\$\{.*%'

'...'逃往何处全部shell 的字符(其中,\(引用运算符)、$(扩展运算符)和*(glob 运算符)是特殊的,有时是%(作业扩展运算符)),并且对正则\表达式转义and 。${

或者:

rg '[$][{].*%'

rg理解类似于现代扩展正则表达式中的特殊运算符的perl正则表达式。{x,y}但请注意,在基本的grepwithout -E// -P/ -A, /所理解的正则表达式并不特殊,但是-X,是!所以你必须{}\{\}不是{对它们中的/进行转义}以按字面意思处理grep(或默认情况下sed// ed/ ex... vi)。

您可能需要将正则表达式更改为:

rg '\$\{[^}]*%'

我们将.(匹配任何单个字符), 替换为[^}](匹配除 之外的任何单个字符}) 以避免内部匹配:

物品${foo} 是 20%比商品便宜 ${bar}

例如。

看看你的尝试:

  • rg "\$\{.\*%"rg '$\{.\*%',这与大多数 shell 中的相同, \shell 使用$它来删除其特殊含义。保留在and\前面,因为这些字符在双引号内并不特殊。{*
  • rg \$\{.\*%, 与...一样rg '${.*%'\引号之外只是另一个引用运算符。\x就像'x'(换行符,有时`!特殊情况)。在fishshell 中,\也可用于\n, \t, \a, \377... 转义序列。
  • rg "\$\{.*%", 与 一样rg '$\{.*%', 很接近
  • rg \$\{.*%情况会更糟,因为通配符最终不会被引用,因此 shell 可以将其扩展为名称以当前工作目录开头和结尾的*文件列表。${%

相关内容