正则表达式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的文件。 这只是一个例子。 有无穷无尽的可能性。