通配符的行为是否有所不同?

时间:2016-03-23 20:15:56

标签: regex unix grep wildcard glob

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

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)失败了?

这种情况在不同情况下会有所不同吗?如果有,在哪里可以找到此信息。

1 个答案:

答案 0 :(得分:4)

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

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

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

你想要

grep '.*\.xml'

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

(出于实际目的,您当然只能使用grep .xmlgrep '\.xml$'