首页 » 信息技术 »

glob模式匹配

2019年2月26日 / 358次阅读
Linux常用命令

glob是一个古老的UNIX程序,用来进行文件路径名的模式匹配。在后来发展中,glob模式匹配又有一些扩展,但是基本思路没有变化。glob的模式匹配跟正则表达式不太一样,它比正则表达式要简单一些。glob的模式匹配有时也叫做通配符匹配(wildcard matching)。下面的文字来自man page,我自己一边翻译一边学习。

glob模式匹配的规则

wildcard matching 通配符匹配

A string is a wildcard pattern if it contains one of the characters
'?', '*' or '['. Globbing is the operation that expands a wildcard
pattern into the list of pathnames matching the pattern. Matching is
defined by:

A '?' (not between brackets) matches any single character.

A '*' (not between brackets) matches any string, including the empty
string.

如果字符串含有?,*,或者[,这三种符号,这个字符串就就是通配符模式字符串。

Globbing(glob的模式匹配)就是扩展通配符模式,使其变为一个符合此模式的路径名的列表(list)。

?:(不在括号内时)匹配任意一个字符;

*:(不在括号内时)匹配任意字符串,包括空串;

xinlin@ubuntu:~/repos$ ll
total 24
drwxr-xr-x  6 xinlin xinlin 4096 Aug 17 18:07 ./
drwxr-xr-x 20 xinlin xinlin 4096 Aug 17 18:07 ../
drwxr-xr-x  3 xinlin xinlin 4096 Aug  8 11:27 gas/
drwxr-xr-x  3 xinlin xinlin 4096 Jul 26 20:17 sendslip/
drwxrwxr-x  3 xinlin xinlin 4096 Aug 13 11:29 smally/
drwxrwxr-x  3 xinlin xinlin 4096 Aug  3 23:21 tucai/
xinlin@ubuntu:~/repos$ echo *
gas sendslip smally tucai
xinlin@ubuntu:~/repos$ echo s?*
sendslip smally

Character classes 字符集合

An expression "[...]" where the first character after the leading '['
is not an '!' matches a single character, namely any of the
characters enclosed by the brackets. The string enclosed by the
brackets cannot be empty; therefore ']' can be allowed between the
brackets, provided that it is the first character. (Thus, "[][!]"
matches the three characters '[', ']' and '!'.)

字符集合:[...]这样的表达式,[]不能为空;

[abc123]表示匹配abc123这6个字符的任意一个;

[][!]表示匹配],[,或者!。

xinlin@ubuntu:~/repos$ echo ?[abcde]*
gas sendslip

Ranges 范围

There is one special convention: two characters separated by '-'
denote a range. (Thus, "[A-Fa-f0-9]" is equivalent to
"[ABCDEFabcdef0123456789]".) One may include '-' in its literal
meaning by making it the first or last character between the
brackets. (Thus, "[]-]" matches just the two characters ']' and '-',
and "[-.0]" matches the three characters '-', '.', '0', since '/'
cannot be matched.)

在[]中使用-,表示一个字符范围,这个范围来自ASCII表;比如[A-Fa-f0-9]等价于[AFCDEFabcdef0123456789],在一个[]内,可以有多个范围。

[]-],表示匹配]和-;[-.o]表示匹配-,.,o这三个字符;

/不能被匹配,因为pathname就靠这个符号支撑!

xinlin@ubuntu:~/repos$ echo ?[a-f]*
gas sendslip

Complementation 补充

An expression "[!...]" matches a single character, namely any
character that is not matched by the expression obtained by removing
the first '!' from it. (Thus, "[!]a-]" matches any single character
except ']', 'a' and '-'.)

[!...]表示非此范围内的字符;

[!]a-],表示任意字符除了],a,-这三个。

xinlin@ubuntu:~/repos$ echo ?[!a-f]*
smally tucai

One can remove the special meaning of '?', '*' and '[' by preceding
them by a backslash, or, in case this is part of a shell command
line, enclosing them in quotes. Between brackets these characters
stand for themselves. Thus, "[[?*\]" matches the four characters
'[', '?', '*' and '\'.

使用backslash(\),可以匹配?,*,[;

一般path那么很少见这些特殊的符号,虽然理论上可以,实践上意义不大。

更多更详细的介绍:http://man7.org/linux/man-pages/man7/glob.7.html

glob模式匹配与和正则表达式的区别

1,元字符代表的意思不同,如glob中*指匹配零个或多个字符,而*在正则表达式中指前面的字符出现零次或多次;

2,正则表达式支持更多更复杂的字符串匹配模式,glob只是简单的匹配pathname;

3,glob匹配的是整个字符串,而正则表达式匹配的是子字符串,如:

在glob中S*.DOC匹配S.DOC和SA.DOC,但是不匹配POST.DOC或SURREY.DOCKS,但是在正则表达式中匹配的是子字符串,除非用^ 和$ 进行限定^S.*\.DOC$

4,glob用于文件名的匹配,所以通配符不能匹配路径分隔符/,  另外如果文件名是以.开始,则必须准确匹配;

针对/符号不能匹配的,我这里给出一个示例:

xinlin@ubuntu:~/repos$ echo ?[a-f]*/*
gas/gas.ico gas/gas.py gas/README.md sendslip/config.ini sendslip/README.md sendslip/sendslip2.py sendslip/sendslip.py

这行命令的含义,显示以任意1个字符开始(没有点.),第2个字符在a到f之间的路径下的所有文件。

点(.)在glob规则中必须精确匹配,给出一个示例:

xinlin@ubuntu:~/test$ touch .abc123.txt
xinlin@ubuntu:~/test$ echo *a*1*
*a*1*
xinlin@ubuntu:~/test$ echo ?a*1*
?a*1*
xinlin@ubuntu:~/test$ echo .a*1*
.abc123.txt

创建一个以点(.)开始的文件(隐藏文件),然后用*和?去去匹配点(.),都失败,必须要精确地使用点(.)去匹配它自己。

以上就是对Linux环境下常见的glob模式匹配的介绍,希望对你有帮助。

本文链接:https://www.maixj.net/ict/glob-20307

留言区

《glob模式匹配》有2条留言

  • 麦新杰

    关键是要理解,glob匹配pathname后,得到的是一个list,这个list的每个元素都会被前面的命令执行。 []

  • 麦新杰

    执行echo *,就理解glob是用来做pathname的匹配的,同时也可以用这个命令来查看glob的开关状态。 []


前一篇:
后一篇:
-->只要几分钟回答问卷,就能轻松赚现金!

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

go to top