正则表达式 VS 文件名通配符

正则表达式 VS 文件名通配符

我知道正则表达式只能用于字符和字符串,但有时我在文件名中发现它们。我的问题是:正则表达式仅有的与字符一起使用还是也与文件名一起使用?

答案1

正则表达式和文件名通配是两个非常不同的东西。

正则表达式用于命令/函数中文本的模式匹配。例如,的模式参数中grep,或在编程语言中。

文件名通配符由 shell 使用,用于使用通配符匹配文件和目录名称。通配符的功能取决于 shell。例如,Bash 支持以下通配符:

  • *匹配 0 个或更多字符
  • ?匹配 1 个字符
  • [...]匹配指定集合中的字符

这些通配符可能看起来与正则表达式相似,实际上[...]在通配符和正则表达式中具有相同的含义。但是*?在通配符和正则表达式中的含义不同。

您在评论中写道:

但是解释器如何区分*它是小丑还是正则表达式?例如:grep a*b a*.txt

简单,有点儿像。

首先,shell 会尝试解释通配符,方法是将它们与文件名进行匹配。如果有以“a”开头并以“b”结尾的文件,shell 将替换a*b为匹配的文件名。对于 也是如此。如果没有匹配的文件名,shell将按原样a*.txt将参数传递给。grep

但是,的第一个参数grep应该是一个模式。在 99.999% 的实际用例中,您不希望 shell 解释第一个参数。因此,最可能的意图是:

grep "a*b" a*.txt

由于引用了a*b,shell 不会使用通配符来解释它,而是直接将其传递给grep。反过来,grep会将其解释为正则表达式(根据设计)。

总结一下,shell 按照自己的通配符语言(即使用通配符)解释命令行。命令、程序按照作者设计的方式解释其参数。

答案2

如果文件名对您来说是字符串,您也可以对文件名使用正则表达式。例如:如果您想查找与正则表达式匹配的文件名,您可以尝试:

find ./ -regex '.*[abc][xyz].*'

该命令查找名称中包含 a、b 或 c 且后跟 x、y 或 z 的文件。这只是一个例子。还有无数种可能。

相关内容