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

标签 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) 则失败?

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

最佳答案

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

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

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

你想要

grep '.*\.xml'

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

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

关于regex - 通配符的行为是否有所不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36187896/

相关文章:

javascript - jQuery/HTML 匹配 div 的文本

regex - 正则表达式比较

git - 来自 docker 的 git 的主机 key 验证失败

c - 如何在 unix 上以 C 图形方式打印到控制台

mysql - 如何过滤mysql.log整个查询?

regex - 如何在mongodb中搜索逗号分隔的数据

php - 如何将 preg_replace e 转换为 preg_replace_callback?

linux - 有没有办法找到GCP VM启动脚本返回代码

regex - GREP 和 RegEx - 查找模式并再次查找

regex - 为什么 grep 不匹配 "\<\-v\>"