我想知道哪些文件有字符串$Id$
.
grep \$Id\$ my_dir/mylist_of_files
返回 0 次出现。
我发现我必须使用
grep \$Id$ my_dir/mylist_of_files
然后我看到$Id
输出中的 是彩色的,即它已匹配。
我怎样才能匹配第二个$
以及为什么不起作用\$Id\$
。
$
第二个字符是否是最后一个字符并不重要。
我用的是grep
2.9。
在发布我的问题之前,我使用了谷歌...
要在名为 test2 的文件中搜索 $(美元符号),请输入:
grep \\$ test2
为了强制 shell 将 \$(单反斜杠、美元符号)传递给 grep 命令,必须使用 \\(双反斜杠)字符。 \(单个反斜杠)字符告诉 grep 命令将后面的字符(在此示例中为 $)视为文字字符而不是表达式字符。使用 fgrep 命令可以避免使用转义字符(例如反斜杠)。
但我不明白为什么grep \$Id
有效,为什么grep \\$Id\\$
无效。
我有点困惑...
答案1
这里有两个单独的问题。
grep
用途基本正则表达式(BRE),并且$
是 BRE 中仅出现在表达式末尾的特殊字符。这样做的结果是$
in的 2 个实例$Id$
不相等。第一个是普通字符,第二个是与行尾匹配的锚点。要使第二个$
匹配成为文字,$
您必须使用反斜杠转义它,即$Id\$
.转义第一个$
也可以:\$Id\$
,我更喜欢这个,因为它看起来更一致。这里有两种完全不相关的转义/引用机制在起作用: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