正则表达式:[a] bc vs abc

时间:2012-07-04 05:52:08

标签: regex

我不是正则表达专家,但我认为我理解了基础知识。我正在阅读使用此语法提到的tutorial

$ ps -ewwo pid,args | grep [s]sh

确定SSHD是否正在运行。

我不明白为什么第一个s在括号中。我认为ssh[s]sh会产生相同的结果,但实际上会得到不同的结果。

$ ps -ewwo pid,args | grep [s]sh
 1258 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session gnome-session --session=ubuntu
 2988 /usr/sbin/sshd -D

$ ps -ewwo pid,args | grep ssh
 1258 /usr/bin/ssh-agent /usr/bin/dbus-launch --exit-with-session gnome-session --session=ubuntu
 2988 /usr/sbin/sshd -D
 3082 grep --color=auto ssh

那么为什么它会在第二个例子中找到第三个结果呢?

谢谢!

3 个答案:

答案 0 :(得分:6)

正则表达式[a]bcabc完全匹配相同的字符串集,但是它们被应用于不同的数据,因为grep的命令行参数出现在ps命令的输出。

使用[a]bc会导致文字字符串"[a]bc"出现在ps的输出中 - 这与正则表达式[a]bc不匹配。

我们的想法是避免匹配grep命令本身的行。

答案 1 :(得分:1)

当您将ps导入grep时,您经常会找到正在运行的grep进程,因为该术语存在于程序名称中,并且很可能会匹配。

答案 2 :(得分:1)

括号是character class,但是如果一个字符具有一个字符且没有指定重复,则没有任何意义。

您获得不同结果的原因是因为ssh与进程列表中的grep参数匹配,但[s]sh与自身不匹配。