我曾经运行过类似 find /dev | grep sd* 的命令来输出连接到我电脑的所有驱动器的列表。现在看来我必须添加任意随机字符在星号之前以获得相同的效果,如下所示:
我在各种 Ubuntu 12.04 服务器上测试了这一点,并得到了相同的效果,因此我认为这不是我桌面上的随机现象。这是一个新的变化、一个错误,还是一直都是这样,我的内存需要更换?
答案1
你有两个问题:
- 通配符干扰你的正则表达式
- 您的正则表达式与应匹配的内容不匹配
揭示通配符机制
sudo find /dev | grep sd*
无法像以前一样工作,因为您当前工作目录中有一个文件或文件夹,它会触发来自 bash 的通配符。echo
在命令前面添加一个,看看通配符对命令有什么影响
echo grep sd*
通过添加一个随机的附加字符,globbing 不再匹配文件/文件夹,而 grep 继续按预期工作。
如何防止通配符
为了防止通配符生效,您必须将'...'
术语括起来。(双引号也可以。)这将使 grep 的行为与以前一样:
sudo find /dev | grep 'sd*'
正则表达式的工作原理
现在正则表达式是否按预期工作让我们看看*
在正则表达式中的意思,而不是文件通配符。简而言之,它意味着“最后一个字符零次或 n 次”,这很可能不是您想要的。使用您可能会在输出中'sd*'
看到,因为以开头,然后是/dev/stdout
stdout
s
零或更多的d
。
对于你来说很简单:
sudo find /dev | grep sd
应该是您需要匹配的全部内容。
或者,当然,您可以只运行以下命令之一(使用文件 glob 模式,而不是正则表达式)来获得相同的输出:
find /dev -name 'sd*'
ls -1 /dev/sd*