假设我有一个包含类似内容的脚本
VAR=${VAR1%.*}
我正在寻找类似的命令
rg "${.*%"
想要找到它,但我无法靠近。
所有这些都失败了
rg "\$\{.\*%"
rg \$\{.\*%
rg "\$\{.*%"
rg \$\{.*%
答案1
$
,\
对于正则表达式和 shell 来说是特殊的(包括后者的双引号内)。{
在某些上下文中,对于 shell 来说也是特殊的,其列表随 shell 的不同而变化。
事实上,许多正则表达式运算符(*
、?
、|
、{
、}
、(
、)
、\
、^
、$
、[
至少]
)在 shell 语法中也很特殊(一些无论如何 shell),因此最好将正则表达式括在单引号内,在大多数 shell 中,所有字符都会失去其特殊含义(如果有)。
所以:
rg '\$\{.*%'
'...'
逃往何处全部shell 的字符(其中,\
(引用运算符)、$
(扩展运算符)和*
(glob 运算符)是特殊的,有时是%
(作业扩展运算符)),并且对正则\
表达式转义and 。$
{
或者:
rg '[$][{].*%'
rg
理解类似于现代扩展正则表达式中的特殊运算符的perl
正则表达式。{x,y}
但请注意,在基本的grep
without -E
// -P
/ -A
, /所理解的正则表达式并不特殊,但是-X
,是!所以你必须{
}
\{
\}
不是{
对它们中的/进行转义}
以按字面意思处理grep
(或默认情况下sed
// ed
/ ex
... vi
)。
您可能需要将正则表达式更改为:
rg '\$\{[^}]*%'
我们将.
(匹配任何单个字符), 替换为[^}]
(匹配除 之外的任何单个字符}
) 以避免内部匹配:
物品${foo} 是 20%比商品便宜 ${bar}
例如。
看看你的尝试:
rg "\$\{.\*%"
rg '$\{.\*%'
,这与大多数 shell 中的相同,\
shell 使用$
它来删除其特殊含义。保留在and\
前面,因为这些字符在双引号内并不特殊。{
*
rg \$\{.\*%
, 与...一样rg '${.*%'
。\
引号之外只是另一个引用运算符。\x
就像'x'
(换行符,有时`
是!
特殊情况)。在fish
shell 中,\
也可用于\n
,\t
,\a
,\377
... 转义序列。rg "\$\{.*%"
, 与 一样rg '$\{.*%'
, 很接近rg \$\{.*%
情况会更糟,因为通配符最终不会被引用,因此 shell 可以将其扩展为名称以当前工作目录开头和结尾的*
文件列表。${
%