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

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

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

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

  param="ambari_parameter$"
  echo "ambari_parameter$" | grep $param
  echo "ambari_parameter$" | grep "$param"

答案1

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

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

echo 'ambari_parameter$' | grep -F -e "$param"

使用grep -F使得grep将给定模式视为字符串而不是正则表达式。因此,模式中的每个字符都将按字面匹配,即使是$末尾的字符也是如此。

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

进一步要求所有的输入行匹配完整的字符串,添加-x

echo 'ambari_parameter$' | grep -xF -e "$param"

如果$paramambari_parameter$,那么这将与字符串_ambari_parameter$ambari_parameter$100(但是将要-x如果省略则匹配)。

答案2

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

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

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

param='ambari_parameter\$'
echo "ambari_parameter$" | grep "$param"

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

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

答案3

如果您正在寻找完全匹配的特殊字符,则应该转义特殊字符,如下所示:

如果它在单引号中,则需要一次转义。

grep 'parameter\$'

如果它用双引号或不带引号,则需要再进行一次转义。

grep "parameter\\$" #or
grep parameter\\$

请注意,匹配中的任何空格如果未加引号,也应进行转义。

grep para\ meter\\$

相关内容