如何将包含字符“$”的字符串与grep匹配?

yae*_*ael 8 grep bash special-characters

如何匹配包含$字符的字符串?

示例 - 以下grep不返回匹配项。

  param="ambari_parameter$"
  echo "ambari_parameter$" | grep $param
  echo "ambari_parameter$" | grep "$param"
Run Code Online (Sandbox Code Playgroud)

Kus*_*nda 14

在这种情况下,字符串 in$param将被解释为正则表达式。此表达式包含将模式中的$锚定ambari_parameter到匹配结尾的 。由于ambari_parameter$在输入数据的最后不包含ambari_parameter(由于$在字符串的末尾),它不会匹配。

您可以在模式中对$as\$进行转义(\\$在双引号字符串中),或将$as 放在方括号组中[$],但由于您似乎想要进行字符串匹配而不是正则表达式匹配,因此可能更适合使用-F

echo 'ambari_parameter$' | grep -F -e "$param"
Run Code Online (Sandbox Code Playgroud)

使用grep -F品牌grep对待给定的图案作为一个字符串,而不是作为一个正则表达式。因此,模式中的每个字符都将按字面意思匹配,甚至$是末尾的字符。

我还在-e这里使用强制grep将以下参数识别为模式。如果$param以破折号 ( -)开头,则这是必要的。-e每当您匹配的模式在变量中给出时,通常都可以使用它。

要进一步要求整个输入行与完整字符串匹配,请添加-x

echo 'ambari_parameter$' | grep -xF -e "$param"
Run Code Online (Sandbox Code Playgroud)

如果$paramambari_parameter$,那么这将不匹配字符串_ambari_parameter$ambari_parameter$100(但如果被遗漏匹配-x)。


Eli*_*gan 8

如果您有一个想要逐字匹配的整个模式,则不要将其视为正则表达式。如果确实需要匹配$正则表达式中的文字,请使用\$.

.,\和其他几个标点符号一样,$是正则表达式中的元字符。该$字符匹配行尾的空字符串(因此x$匹配x但仅在行尾)。如果您的模式不包含任何元字符,那么您不需要将其视为正则表达式,您应该grep -F 像 Kusalananda 解释的那样使用。

如果您确实需要$在正则表达式中逐字匹配一个或任何其他元字符,请使用\元字符对其进行转义。匹配文字$write \$,匹配文字\write \\,等等。

param='ambari_parameter\$'
echo "ambari_parameter$" | grep "$param"
Run Code Online (Sandbox Code Playgroud)

param在 shell 中分配 to时,将正则表达式用单引号 ( ' ')括起来,如上所示,因为$\在大多数 shell 中也具有特殊含义,包括所有 Bourne 样式的 shell(您标记​​了)。\在 shell 中的工作原理与在正则表达式中基本相同。($不是;它用于各种外壳扩展/替换,尤其是参数扩展)。

不加引号,甚至是双引号\$表示$shell 中的文字,然后传递给grepas $grep解释为正则表达式元字符。将它括在单引号中可以防止这种情况。你也可以写——\\\$或者有时只是——\\$但这很令人困惑。