我想了解通配符的行为是否相同,例如:
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) 则失败?
这在不同情况下表现是否不同,如果是,在哪里可以找到此信息。
最佳答案
Shell 使用通配符。 https://en.wikipedia.org/wiki/Glob_(programming)
Grep 使用正则表达式。 https://en.wikipedia.org/wiki/Regular_expression
它们是两种不同的语言,对于 grep 来说,*
不是通配符。它表示前一个字符,重复零次或多次
你想要
grep '.*\.xml'
表示任何字符 (.
)重复零次或多次(*
),后跟文字“.” (\.
) xml
(出于实际目的,您当然可以使用 fgrep .xml
或 grep '\.xml$'
)
关于regex - 通配符的行为是否有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187896/