揭示通配符机制

揭示通配符机制

我曾经运行过类似 find /dev | grep sd* 的命令来输出连接到我电脑的所有驱动器的列表。现在看来我必须添加任意随机字符在星号之前以获得相同的效果,如下所示:

sudo 查找 /dev | grep sdp*

我在各种 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/stdoutstdouts或更多的d

对于你来说很简单:

sudo find /dev | grep sd

应该是您需要匹配的全部内容。


或者,当然,您可以只运行以下命令之一(使用文件 glob 模式,而不是正则表达式)来获得相同的输出:

find /dev -name 'sd*'
ls -1 /dev/sd*

相关内容