虽然我们使用*来表示 0 个或多个前面的字符grep,*.c但当我们将它与ls诸如ls *.c. 有人能说出*在这两种情况下的使用有何不同吗?
War*_*ung 31
Shell 文件名通配符和正则表达式使用一些相同的字符,它们具有相似的用途,但您是对的,它们不兼容。文件名通配是一个功能要弱得多的系统。
在文件名通配中:
* 表示“零个或多个字符”
? 意思是“任何单个字符”
但是在正则表达式中,您必须使用.*来表示“零个或多个字符”,并且.表示“任何单个字符”。A?在正则表达式中的含义完全不同:前一个 RE 元素的零个或一个实例。
方括号 ( []) 在我正在输入的系统上的两个系统中的工作方式相同,至少对于简单的情况是这样。这包括诸如 POSIX 字符类(例如[:alpha:])之类的东西。也就是说,如果您需要您的命令在许多不同的系统类型上工作,我建议不要使用超出基本内容的任何东西,例如字符列表(例如[abeq])和字符范围(例如[a-c])。
这些差异意味着这两个系统只能在简单情况下直接互换。如果您需要文件名的正则表达式匹配,则需要以另一种方式进行。find -regex是一种选择。(请注意,find -name顺便说一下,还有 使用 glob 语法。)
jll*_*gre 12
回答原标题中表达的问题:
为什么正则表达式与用于过滤文件的表达式不同?
文件名扩展早于正则表达式,在大多数操作系统(通配符/小丑字符)中已经存在,并且比后者更简单和直观。
虽然普通*.txt用户很容易理解,但类似.*\.txt的东西更适合有经验的用户/程序员,更不用说^.*\.txt$......