正则表达式与通配符¶
在 GNU/Linux 操作系统中,正则表达式和通配符常使用相同的符号(或样式),因此人们非常容易混淆它们。
正则表达式和通配符有什么区别?
相同点:
- 它们有相同的符号,但代表完全不同的含义。
不同点:
- 正则表达式与文件内容匹配;通配符通常用于匹配文件名或目录名。
- 正则表达式通常用于
grep、sed、awk等命令。 - 通配符通常与诸如
cp、find、mv、touch、ls等命令一起使用。
GNU/Linux 中的通配符¶
GNU/Linux 操作系统支持这些通配符:
| 通配符样式 | 作用 |
|---|---|
| ? | 匹配文件名或目录名的一个字符。 |
| * | 匹配文件名或目录名的 0 个或多个任意字符。 |
| [ ] | 匹配括号中的任何单个字符。 例如,[one] 表示匹配 o、n 或 e 。 |
| [-] | 匹配括号中给定范围内的任何单个字符。 例如,[0-9] 匹配 0 到 9 之间的任何单个数字。 |
| [^] | 单字符的 "逻辑非" 匹配。 例如,[^a-zA-Z] 表示匹配单个非字母字符。 |
| {,} | 多个单字符的非连续匹配。 用逗号分隔。 |
| {..} | 与 [-] 相同。 例如 {0..9} 和 {a..z} |
不同的命令对通配符样式有不同的支持:
find:支持 *、?、[ ]、[-] 和 [^]ls:全部支持mkdir:支持 {,} 和 {..}touch:支持 {,} 和 {..}mv:全部支持cp:全部支持
例如:
Shell > mkdir -p /root/dir{1..3}
Shell > cd /root/dir1/
Shell > touch file{1,5,9}
Shell > cd
Shell > mv /root/dir1/file[1-9] /root/dir2/
Shell > cp /root/dir2/file{1..9} /root/dir3/
Shell > find / -iname "dir[1-9]" -a -type d
GNU/Linux 中的正则表达式¶
由于历史发展的原因,正则表达式存在两个主要流派:
- POSIX:
- BRE(Basic Regular Express,基础正则表达式)
- ERE(Extend Regular Express,扩展正则表达式)
- POSIX character class
- PCRE(Perl Compatible Regular Expressions):在各种编程语言中最常见。
| BRE | ERE | POSIX character class | PCRE | |
|---|---|---|---|---|
grep |
√ | √ (需要 -E 选项) |
√ | √ (需要 -P 选项) |
sed |
√ | √ (需要 -r 选项) |
√ | × |
awk |
√ | √ | √ | × |
欲了解更多有关正则表达式的内容,请访问 此网站 以获取更多有用的信息。
BRE¶
BRE(Basic Regular Express,基础正则表达式)是最古老的正则表达式类型,由 UNIX 系统中的 grep 命令和 ed 文本编辑器引入。
| 元字符 | 说明 | bash 示例 |
|---|---|---|
| * | 匹配前一个字符的出现次数,可以是 0 或任意次数。 | |
| . | 匹配除换行符之外的任何单个字符。 | |
| ^ | 匹配行开头。 例如 - ^h 将匹配以 h 开头的行。 | |
| $ | 匹配行结尾。 例如 - h$ 将匹配以 h 结尾的行。 | |
| [] | 匹配括号中指定的任意单个字符。 例如 - [who] 将匹配 w、h 或 o;[0-9] 将匹配一个数字;**[0-9][a-z]**将匹配由一个数字和一个小写字母组成的字符。 | |
| [^] | 匹配除括号内字符之外的任何单个字符。 例如 - [^0-9] 将匹配任何单个非数字字符。 [^a-z] 将匹配除小写字母以外的任何单个字符。 | |
| \ | 转义符,用于取消某些特殊符号所代表的含义。 | echo -e "1.2\n122" \| grep -E '1\.2'1.2 |
| \{n\} | 匹配前一个单字符的出现次数,n 表示匹配的次数。 | echo -e "1994\n2000\n2222" \| grep "[24]\{4\}"2222 |
| \{n,\} | 匹配前一个单字符至少出现 n 次。 | echo -e "1994\n2000\n2222" \| grep "[29]\{2,\}"1994 2222 |
| \{n,m\} | 匹配前面单字符至少 n 次且至多 m 次。 | echo -e "abcd\n20\n300\n4444" \| grep "[0-9]\{2,4\}"20 300 4444 |
ERE¶
| 元字符 | 说明 | bash 示例 |
|---|---|---|
| + | 匹配前一个单字符的出现次数,可以是1次或多次。 | echo -e "abcd\nab\nabb\ncdd" \| grep -E "ab+"abcd ab abb |
| ? | 匹配前一个单字符的出现次数,可以是 0 次或 1 次。 | echo -e "ac\nabc\nadd" \| grep -E 'a?c'ac abc |
| \< | 边界符,匹配字符串的开头。 | echo -e "1\n12\n123\n1234" \| grep -E "\<123"123 1234 |
| \> | 边界符,匹配字符串的结尾。 | echo -e "export\nimport\nout" \| grep -E "port\>"export import |
| () | 组合匹配,即将括号中的字符串作为组合,然后进行匹配。 | echo -e "123abc\nabc123\na1b2c3" \| grep -E "([a-z][0-9])+"abc123 a1b2c3 |
| | | 管道符表示 "或" 的含义。 | echo -e "port\nimport\nexport\none123" \| grep -E "port\>\|123"port import export one123 |
ERE 还支持具有特殊含义的字符:
| 特殊字符 | 说明 |
|---|---|
| \w | 等同于 [a-zA-Z0-9] |
| \W | 等同于 [^a-zA-Z0-9] |
| \d | 等同于 [0-9] |
| \D | 等同于 [^0-9] |
| \b | 等同于 \< 或 \> |
| \B | 匹配非边界符。 |
| \s | 匹配任何空白字符。 等同于 [ \f\n\r\t\v] |
| \S | 等同于 [^ \f\n\r\t\v] |
| 空白字符 | 说明 |
|---|---|
| \f | 匹配单个换页符。 等同于 \x0c 和 \cL |
| \n | 匹配单个换行符。 等同于 \x0a 和 \cJ |
| \r | 匹配单个回车符。 等同于 \x0d 和 \cM |
| \t | 匹配单个制表符。 等同于 \x09 和 \cI |
| \v | 匹配单个垂直制表符。 等同于 \x0b 和 \cK |
POSIX 字符¶
有时,您可能会看到 "POSIX 字符"(也称为 "POSIX 字符类")。 请注意,作者很少使用 "POSIX 字符类",但为加深基础理解,特此包含了这一部分。
| POSIX 字符 | 等同于 |
|---|---|
| [:alnum:] | [a-zA-Z0-9] |
| [:alpha:] | [a-zA-Z] |
| [:lower:] | [a-z] |
| [:upper:] | [A-Z] |
| [:digit:] | [0-9] |
| [:space:] | [ \f\n\r\t\v] |
| [:graph:] | [^ \f\n\r\t\v] |
| [:blank:] | [ \t] |
| [:cntrl:] | [\x00-\x1F\x7F] |
| [:print:] | [\x20-\x7E] |
| [:punct:] | [][!"#$%&'()*+,./:;<=>?@^_`{|}~-] |
| [:xdigit:] | [A-Fa-f0-9] |
在线练习¶
有许多网站可以供人们在线练习正则表达式技能,例如:
Author: tianci li