Ham*_*mza 22 files regex wildcards
我知道正则表达式只能用于字符和字符串,但有时我会在文件名中找到它们。我的问题是:正则表达式仅用于字符还是文件名?
jan*_*nos 29
正则表达式和文件名通配是两个非常不同的东西。
正则表达式在命令/函数中用于文本中的模式匹配。例如在 的模式参数中grep,或在编程语言中。
shell 使用文件名通配符匹配文件名和目录名,使用通配符。globbing 的功能取决于 shell。例如,Bash 支持通配符,例如:
* 匹配 0 个或多个字符? 匹配 1 个字符[...] 匹配指定集中的字符这些通配符可能看起来类似于正则表达式,[...]在通配符和正则表达式中确实具有相同的含义。但是*,?在通配符和正则表达式中意味着不同的东西。
你在评论中写道:
但是解释器如何区别 * 无论是小丑还是正则表达式?例如:
grep a*b a*.txt?
简单。有点。
首先,shell 尝试通过将通配符与文件名进行匹配来解释通配符。如果存在以“a”开头并以“b”结尾的文件,shell 将替换a*b为匹配的文件名。也一样a*.txt。如果没有匹配的文件名,shell 将按grep原样将参数传递给它们。
但是,的第一个参数grep应该是一个模式。在 99.999% 的实际用例中,您不希望 shell 解释第一个参数。所以最有可能的意图是这样的:
grep "a*b" a*.txt
Run Code Online (Sandbox Code Playgroud)
多亏了 quoting a*b,shell 不会使用通配符来解释它,而是直接将它传递给grep. 反过来,grep将其解释为正则表达式(按设计)。
总而言之,shell 会按照它自己的通配符语言来解释命令行。命令、程序以作者设计的任何方式解释它们的参数。
如果文件名是字符串,则也可以对文件名使用正则表达式。例如:如果您想查找与正则表达式匹配的文件名,您可以尝试:
find ./ -regex '.*[abc][xyz].*'
Run Code Online (Sandbox Code Playgroud)
该命令查找名称中包含 a、b 或 c 后跟 x、y 或 z 的文件。这只是一个例子。有无限的可能性。