在 grep -E(或 egrep)里,\d 不是基本/扩展正则表达式(ERE)定义的转义序列,所以 \d 里的反斜杠会被 shell 先吃掉一层,剩下的 d 就成为普通的字母 “d”。
具体流程
shell 去掉一层转义 → 真正传给 grep 的正则表达式就是 d
grep -E 用扩展正则匹配 普通字符 d
结果
grep -E '\d' passwd # 实际等价于
grep -E 'd' passwd # 找出包含字母 d 的行
在双引号里,反斜杠(\)是 POSIX shell 的“转义字符”,它的本职任务就是把紧随其后的那个字符“转义”掉——也就是取消该字符原本在 shell 语法中的特殊含义。
当 \ 后面跟的是一个没有特殊含义的字符时,POSIX 规定“结果就是把反斜杠本身去掉”,于是:
"\d"
shell 看到双引号里的 \d;
发现 \ 后面是普通字母 d(在双引号里 d 本来就没有特殊意义);
按规则把反斜杠删掉,只把 d 作为参数传给 grep。
双引号里 反斜杠必须转义 的字符
后面字符 | 含义 |
---|---|
" |
把 " 变成普通字符,不再结束字符串。 |
$ |
把 $ 变成普通字符,阻止变量/命令替换。 |
` |
把反引号变成普通字符,阻止命令替换。 |
\ |
两个反斜杠变成一个反斜杠。 |
! |
在 history -n 关闭历史展开时无意义;但在交互 Bash 里,\! 可以阻止历史展开(非 POSIX,但 Bash 支持)。 |
<newline> |
行继续符,把下一行接到当前行,输出时去掉换行。 |