我想了解通配符的行为是否相同,例如:
1)在unix提示符下,如果我输入ls *.xml
,则会列出以.xml
结尾的所有文件,例如:1.xml, first.xml
等。
- >因此,看起来,*匹配任何角色。
2)现在,我试图在文件中使用grep
找到一些文本,然后执行以下命令:
grep -i "*.xml" first.txt
令我惊讶的是,即使first.txt
的内容包含:first.xml
,second.xml
,也没有返回任何结果。
如果我grep -i "xml" first.xml
,那么我会得到结果。
这种行为导致了混淆,*
如何匹配案例(1)中的任何文本,如果案例(2)失败了?
这种情况在不同情况下会有所不同吗?如果有,在哪里可以找到此信息。
答案 0 :(得分:4)
Shell使用globbing。 https://en.wikipedia.org/wiki/Glob_(programming)
Grep使用正则表达式。 https://en.wikipedia.org/wiki/Regular_expression
它们是两种不同的语言,对于grep,*
不是外卡。它表示前一个字符,重复零次或多次
你想要
grep '.*\.xml'
表示任何字符(.
)重复零次或多次(*
)后跟文字“。” (\.
)xml
(出于实际目的,您当然只能使用grep .xml
或grep '\.xml$'
)