在Linux的Shell脚本中,单引号中的反斜杠 '\' 会导致输出不可预测。

3
以下两个命令的输出结果相同:

echo 'my\name' | grep 'my\\name'
my\name

而且下一个命令的输出结果也是相同的。

echo 'my\name' | grep 'my\\\name'
my\name

请问为什么会导致相同的输出?即使加上额外的反斜杠也不会对输出产生任何影响吗?

但是,如果在grep中增加反斜杠的数量到四个,则输出就会消失。

echo 'my\name' | grep 'my\\\\name'

无输出

请指导我grep和单引号、双引号中反斜杠的行为。


1
"superuser.com是寻求帮助的正确场所。" - tod
1
@tod还是[unix.se]? - Tom Fenech
1
grep接受正则表达式,查看反斜杠在正则表达式中的行为以获取答案(也许是这个链接:https://dev59.com/WG865IYBdhLWcg3wBJ4q)。如果您只想要精确匹配,请使用`grep -F`。 - 123
1个回答

2
在前两个示例中,匹配是因为你的正则表达式模式中的\\与输入中的单个\相匹配。第二个示例中的额外\只是转义了n并在输入中匹配了字面上的n
这些示例将更清晰:
echo 'myname' | grep 'my\name'
myname

echo 'myname' | grep 'myna\me'
myname

echo 'myname' | grep 'm\yn\am\e'
myname

echo 'my\name' | grep 'my\name'

echo 'my\name' | grep 'my\\name'
my\name

echo 'my\name' | grep 'my\\\name'
my\name

echo 'my\name' | grep 'my\\\nam\e'
my\name

如果我们在正则表达式模式中使用双引号而不是单引号,那么行为会有什么变化? - frp farhan
1
在双引号中,单个反斜杠“\”被输入为“\”,因此您应该使用:echo 'my\name' | ggrep "my\\\\name" my\name - anubhava
先生,echo语句中双引号内反斜杠的性质是什么?从您的评论中我理解到,在与grep一起使用的正则表达式中,双引号中的双反斜杠被视为单个。但是,如果我在管道的左侧使用双引号,那么行为会如何?请解释一下。 - frp farhan
尽可能在grep模式中使用单引号,并使用双反斜杠来匹配输入中的单个斜杠。但请记住,变量扩展不会在单引号中发生。 - anubhava

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接