通配符的行为是否不同?

Does wildcard characters behave differently?

我想了解通配符的行为是否相同,例如:

1) 在 unix 提示符下,如果我键入 ls *.xml,则它会列出所有以 .xml 结尾的文件,例如:1.xml, first.xml

--> 因此,* 匹配任何字符。

2) 现在,我试图在文件中使用 grep 查找一些文本,我执行了以下命令:

grep -i "*.xml" first.txt

令我非常惊讶的是,没有返回任何结果,即使 first.txt 的内容如下:first.xmlsecond.xml.

如果我这样做 grep -i "xml" first.xml,那么我会得到结果。

此行为导致混淆,* 如何匹配案例 (1) 和案例 (2) 中的任何文本失败?

这在不同情况下表现是否不同,如果有,在哪里可以找到此信息。

Shell 使用 globbing。 https://en.wikipedia.org/wiki/Glob_(programming)

Grep 使用正则表达式。 https://en.wikipedia.org/wiki/Regular_expression

它们是两种不同的语言,对于 grep,* 不是通配符。表示前一个字符,重复零次或多次

你想要

grep '.*\.xml'

表示 任何字符 (.) 重复零次或多次 (*) 后跟文字 '.' (\.)xml

(出于实际目的,您当然可以使用 fgrep .xmlgrep '\.xml$'