为什么我必须两次逃脱“点”?


13

我知道我们可以转义像这样的特殊字符*(){}$\以便将其视为文字。
例如\*\$

但是,如果.我必须做两次,就像\\.其他情况一样,它被认为是特殊字符。例:

man gcc | grep \\.

为什么会这样呢?


你能不能说你必须逃脱两次?
cuonglm

man bash|grep \\.可能是一个例子。
注册用户

3
更准确地说,您不会两次逃脱点,而是逃脱了转义字符,以便将其传递给grep
Cthulhu 2014年

5
您可以使用引号避免转义反斜杠字符:man gcc | grep '\.'
Leonid Beschastny 2014年

1
我强烈喜欢@LeonidBeschastny的建议,因为它的内容更加清晰
Izkata 2014年

Answers:


24

通常,您只需逃脱一次就可以将特殊字符视为文字。有时您必须做两次,因为您的模式被多个程序使用。

让我们讨论您的示例:

man gcc | grep \\.

该命令由两个程序bash解释器和解释grep。第一个转义原因bash知道\是文字,因此第二个是for grep

如果逃避只有一次,\.bash就知道这点是文字,并传递.grep。当grep看到这个.,它认为该点为特殊字符,而不是字面.

如果您逃脱两次,bash会将模式传递\.grep。现在grep知道这是一个文字点。


:因此,点的转义符是否取决于我们使用的管道数量?cmd | cmd | cmd \\\\。那是对的吗????
2014年

6
@Thushi:不。这与您使用一个(或几个)竖线字符无关,甚至适用于grep \\. my_file。命令行由shell解释,使用第一个\ 来转义第二个,因此将一个\ 字面上传递给grep。该点.对于外壳不是特殊的,因此无论如何它都是逐字传递的。然后,Grep读取(单)\ 并使用它来逃脱点.
Ansgar Esztermann 2014年

@AnsgarEsztermann:是的,没错。检查了。谢谢:)
2014年

2
我相信答案有些不正确,因为它说:“第一个转义导致bash知道。是字面意思,第二个是grep。” 实际上,第一个转义让bash知道\是葬礼,然后传递\。给grep。
克苏鲁2014年

@Gnouc我不认为有。echo .只是……在呼应巴赫.角色。
克苏鲁2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.