正则表达式VS Filename通配

我知道正则表达式只能用于字符和字符串,但有时我会在文件名中找到它们。 我的问题是:正则表达式用于字符或文件名吗?

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

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

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

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

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

在你写的评论中写道:

但是翻译的区别是*它是一个小丑还是正则表达式? 例如: grep a*ba*.txt

简单。 有点。

首先,shell尝试通过将它们与文件名匹配来解释通配符。 如果文件以“a”开头并以“b”结尾,则shell将使用匹配的文件名替换a*b 。 同样适用a*.txt 。 如果没有匹配的文件名,shell将按字面意思将参数传递给grep

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

 grep "a*b" a*.txt 

感谢引用a*b ,shell不会使用globbing来解释它,而是直接将它传递给grep 。 反过来, grep会将其解释为正则表达式(按设计)。

总而言之,shell会根据自己的通配语言解释命令行,该语言使用通配符。 命令,程序以其作者设计的任何方式解释其参数。

如果文件名是您的字符串,则也可以将正则表达式用于文件名。 例如:如果要查找与正则表达式匹配的文件名,可以尝试:

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

该命令查找名称中包含a,b或c后跟x,y或z的文件。 这只是一个例子。 有无穷无尽的可能性。