Answers:
正则表达式和文件名遍历是两个非常不同的东西。
在命令/函数中使用正则表达式来进行文本模式匹配。例如,使用的pattern参数grep
或使用编程语言。
外壳程序使用文件名通配符来使用通配符匹配文件名和目录名。globbing的功能取决于外壳。例如,Bash支持通配符,例如:
*
匹配0个或更多字符?
匹配1个字符[...]
匹配指定集合中的字符这些通配符可能看起来类似于正则表达式,[...]
在通配符和正则表达式中确实具有相同的含义。但是*
,?
在遍历和正则表达式中意味着不同的事情。
您在评论中写道:
但是口译员的区别*是小丑还是正则表达式?例如:
grep a*b a*.txt
?
简单。有点。
首先,shell尝试通过将通配符与文件名匹配来解释通配符。如果存在以“ a”开头和以“ b”结尾的文件,则外壳程序将替换a*b
为匹配的文件名。同样适用a*.txt
。如果没有匹配的文件名,则外壳将按grep
原样传递参数。
但是,的第一个参数grep
应该是模式。在99.999%的实际用例中,您不希望外壳解释第一个参数。因此,最有可能的意图是:
grep "a*b" a*.txt
感谢引用a*b
,shell不会使用globlob解释它,而是将其直接传递给grep
。反过来,grep
将其解释为正则表达式(通过设计)。
总结起来,shell使用通配符解释其自身的通配语言,以解释命令行。命令,程序以其作者设计的任何方式解释其参数。
如果文件名适合您的字符串,则也可以将正则表达式用于文件名。例如:如果要查找与正则表达式匹配的文件名,可以尝试:
find ./ -regex '.*[abc][xyz].*'
该命令查找名称中带有a,b或c后跟x,y或z的文件。这只是一个例子。有无尽的可能性。
find ./ -name 'a*'
*用作通配符。键入时find ./ -regex 'a*'
,可以在正则表达式中使用*。重要的区别是开关-name
或-regex
。