首页 新闻 会员 周边 捐助

grep -E '\d' passwd 是找什么\d会被当做元字符吗

0
[已解决问题] 解决于 2025-07-23 10:15

grep -E '\d' passwd 是找什么\d会被当做元字符吗,还是\d会转义,如果转义后是什么?

以下几种,有些工具不支持(-E就不支持),但perl都支持:
\s:匹配空白字符,等价于[[:space:]]
\S:匹配非空白字符,等价于[[1]]
\d:匹配数字,等价于[0-9]
\D:匹配非数字,等价于[^0-9]


  1. :space: ↩︎

_java_python的主页 _java_python | 小虾三级 | 园豆:984
提问于:2025-07-23 10:08
< >
分享
最佳答案
0

在 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> 行继续符,把下一行接到当前行,输出时去掉换行。
_java_python | 小虾三级 |园豆:984 | 2025-07-23 10:14
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册