如何使用ack搜索(转义)美元符号?

时间:2013-02-21 20:26:49

标签: regex perl unix ack

我想知道文字字符串:" $$"在代码库中,但是像这样逃避美元符号:

ack \$\$

不起作用。

4 个答案:

答案 0 :(得分:16)

你对shell引用感到困惑。当您输入:

ack "\\\$\\\$\("

shell插入双引号字符串,以便\\转换为\\$转换为$\(转换为{{ 1}}和ack获取字符串\(作为其参数。通过使用单引号和调用来避免shell插值要简单得多:

\$\$\(

ack '\$\$\(' 替换为ack以探索shell如何扩展字符串。注意

echo

也会起作用,但原因略有不同。在这里,前两个ack "\\$\\$\(" 被视为单个(转义)\,然后\被翻译为$,因为它后跟一个不是$的字符变量名中的有效字符。 \(扩展为\(而非(,因为(不受插值影响,因此无需转义。但请注意,在双引号之外,\(会转换为(

Shell引用规则有时会让人感到困惑!

答案 1 :(得分:16)

使用ack的-Q进行转义。

ack -Q '$$'

答案 2 :(得分:0)

您可以使用三个反斜杠转义美元符号字符,如下所示:

ack "\\\$\\\$"

或使用单引号,您只需要将其转义一次:

ack '\$\$'

答案 3 :(得分:0)

您可以使用printf使用%q格式说明符来处理引用。

$ printf %q '$$('
\$\$\(

help print有以下说法(我在这里假设bash)`

 %q quote the argument in a way that can be reused as shell input