grep 并转义美元符号

grep 并转义美元符号

我想知道哪些文件有字符串$Id$.

grep \$Id\$  my_dir/mylist_of_files

返回 0 次出现。

我发现我必须使用

grep \$Id$ my_dir/mylist_of_files

然后我看到$Id输出中的 是彩色的,即它已匹配。

我怎样才能匹配第二个$以及为什么不起作用\$Id\$

$第二个字符是否是最后一个字符并不重要。

我用的是grep2.9。


在发布我的问题之前,我使用了谷歌...

我找到了答案

要在名为 test2 的文件中搜索 $(美元符号),请输入:

grep \\$ test2

为了强制 shell 将 \$(单反斜杠、美元符号)传递给 grep 命令,必须使用 \\(双反斜杠)字符。 \(单个反斜杠)字符告诉 grep 命令将后面的字符(在此示例中为 $)视为文字字符而不是表达式字符。使用 fgrep 命令可以避免使用转义字符(例如反斜杠)。

但我不明白为什么grep \$Id有效,为什么grep \\$Id\\$无效。

我有点困惑...

答案1

这里有两个单独的问题。

  1. grep用途基本正则表达式(BRE),并且$是 BRE 中仅出现在表达式末尾的特殊字符。这样做的结果是$in的 2 个实例$Id$不相等。第一个是普通字符,第二个是与行尾匹配的锚点。要使第二个$匹配成为文字,$您必须使用反斜杠转义它,即$Id\$.转义第一个$也可以:\$Id\$,我更喜欢这个,因为它看起来更一致。

  2. 这里有两种完全不相关的转义/引用机制在起作用:shell 引用和正则表达式反斜杠引用。问题是正则表达式使用的许多字符对于 shell 来说也是特殊的,除此之外,正则表达式转义字符(反斜杠)也是 shell 引用字符。这就是为什么你经常会看到涉及双反斜杠的混乱,但我不建议在 shell 引用正则表达式时使用反斜杠,因为它的可读性不太好。

    相反,最简单的方法是首先将整个正则表达式放在单引号内,如'regex'.单引号是 shell 的最强引用形式,因此只要您的正则表达式不包含单引号,您就不必再担心 shell 引用,而可以专注于纯 BRE 语法。

因此,将其应用回原始示例,让我们将正确的正则表达式 ( \$Id\$) 放在单引号内。以下应该做你想做的事:

grep '\$Id\$' my_dir/my_file

\$Id\$不起作用的原因是因为应用了 shell 引用删除(更正确的 shell 引用方式)后,grep看到的正则表达式是$Id$.如 (1.) 中所述,此正则表达式$Id仅匹配行尾的文字,因为第一个$是文字,而第二个是特殊锚字符。

还请注意,如果您切换到扩展正则表达式 (ERE),例如,如果您决定使用egrep(或grep -E),则该$字符始终是特殊的。在 ERE 中$Id$永远不会匹配任何内容,因为你不能有字符一行的末尾,所以\$Id\$将是唯一的方法。

答案2

$Id$要在文件中搜索:您可以使用:grep '\$id*' filename

相关内容