Zsh 开发指南(第四篇 字符串处理之通配符)
导读
这是字符串处理系列的第三篇文章。前两篇基本覆盖了字符串处理中的常用操作,但在字符串匹配方面,没有详细展开。
通配符(glob)是 shell 中的一个比较重要的概念,可以认为是正则表达式的简化版本。通配符在字符串匹配和文件名搜索等方面非常有用。本篇只讲它在字符串匹配上的用法。
通配符的基本用法
之前在讲字符串匹配判断时,通配符出现过,就是 *$str"*
两边的星号。
% str1=abcd
% str2=bc
# 星号要在引号外边
% [[ "$str1" == *"$str2"* ]] && echo good
good
星号是最常用的通配符,用于匹配任意数量(包括 0 个)的任意字符。
# 问号用于匹配一个任意字符
% [[ abcd == ab?? ]] && echo good
good
# 中括号用于匹配出现在其中的单个字符
% [[ abcd == abc[bcd] ]] && echo good
good
# 如果中括号里第一个字符是 ^,则匹配除了除了中括号里的单个字符
% [[ abcd == abc[^de] ]] && echo good
% [[ abcd == abc[^ce] ]] && echo good
good
# 中括号里可以指定字符的范围
% [[ a4 == [a-b][2-5] ]] && echo good
good
# 可以指定多个字符范围,并且可以掺杂其他字符
% [[ B4 == [a-cdddA-B][2-5] ]] && echo good
good
# 尖括号用于匹配一定范围的单个整数
% [[ 123 == 12<3-4> ]] && echo good
good
# 可以匹配整个整数
% [[ 123 == <100-200> ]] && echo good
good
# 可以没有上下界,默认的下界是 0,上界是正无穷
% [[ 123 == <100-> && 123 == <-200> ]] && echo good
good
# 可以上下界都没有,那么会匹配任意正整数和 0
# 这个可以用来判断字符串是否构成整数
# [[ 123 == <-> ]] && echo good
good
# ( 1 | 2 | ... ) 用于同时判断多个条件,满足一个即可
% [[ ab == (aa|ab) ]] && echo good
good
# 如果中括号里要用 - 或者 ^,放在最后即可,不需要转义
% [[ -^3 == [a-c-][3^-][3^-] ]] && echo good
good
以上是通配符的基本用法,总结一下。
通配符 | 含义 | |
---|---|---|
* | 任意数量的任意字符 | |
? | 任意一个字符 | |
[abcd] | abcd 中的任意一个字符 | |
1 | 除 abcd 外的任意一个字符 | |
[a-c] | a 和 c 之间的一个字符 | |
[a-cB-Dxyz] | a 和 c、B 和 D 之间以及 xyz 中的一个字符 | |
<1-100> | 1 和 100 之间的整数 | |
<-50> | 0 和 50 之间的整数 | |
<100-> | 大于 100 的整数 | |
<-> | 任意正整数和 0 |
加强版通配符
Zsh 还支持加强版通配符,功能更多一些。如果使用加强版的通配符,需要先在代码里加上 setopt EXTENDED_GLOB
。
通配符 | 含义 | 匹配的样例 |
---|---|---|
^abc | 除了 abc 外的任意字符串 | aaa |
abc^abc | 以 abc 开头,但后边不是 abc 的字符串 | abcabd |
a*c~abc | 符合 a*c 但不是 abc 的字符串 | adc |
a# | 任意数量(包括 0)个 a | aaa |
b## | 一个或者多个 b | b |
(ab)## | 一个或者多个 ab | abab |
(#i)abc | 忽略大小写的 abc | AbC |
(#i)ab(#I)c | 忽略大小写的 ab 接着 c | ABc |
(#l)aBc | a 和 c 忽略大小写,但 B 必须大写 的 aBc | aBC |
(#a1)abc | 最多错(多或缺也算)一个字符的 abc | a2c 或 ab 或 abcd |
此外还有一些更高级的用法,暂时先略过。
总结
字符串的内容先告一段落,但之后的文章依然会不断地涉及字符串,因为数组和哈希表里的内容通常是字符串,处理目录文件时也涉及大量的字符串操作等等,届时会有新的字符串处理方法。此外,如果我发现新的处理字符串的方法或者技巧,也会更新这几篇文章。
参考
http://www.bash2zsh.com/zsh_r...
本文不再更新,全系列文章在此更新维护:github.com/goreliu/zshguide
付费解决 Windows、Linux、Shell、C、C++、AHK、Python、JavaScript、Lua 等领域相关问题,灵活定价,欢迎咨询,微信 ly50247。
- abcd ↩
陌辞寒的技术博客
近期主要更新 Vim 相关文字。
1.9k 声望
108 粉丝
推荐阅读
Vim 操作实用案例分析(一):批量在行首或行尾添加内容
我们写代码或者文档时,经常需要在多行的行首或者行尾添加同样的内容,手动一行行操作显然效率很低,做这样的事情有方便的技巧。 案例一 把 {代码...} 改成 {代码...} 注释掉一段代码是非常常用的操作,很多人都...
陌辞寒阅读 8.5k
使用kubeasz部署高可用kubernetes集群
本实验采用kubeasz作为kubernetes环境部署工具,它是一个基于二进制方式部署和利用ansible-playbook实现自动化来快速部署高可用kubernetes集群的工具,详细介绍请查看kubeasz官方。本实验用到的所有虚拟机默认软...
李朝阳赞 4阅读 765
100 行 shell 写个 Docker
在初接触Docker的时候,我们必须要了解的几个概念就是Cgroup、Namespace、RootFs,如果本身对虚拟化的发展没有深入的了解,那么很难对这几个概念有深入的理解,本文的目的就是通过在操作系统中以交互式的方式去理...
vivo互联网技术赞 2阅读 436
linux中用户登录加载配置文件的过程
shell的类型(站在用户登录登录的角度)登录式shell正常通过某终端登录su - USERNAMEsu -l USERNAME非登录式shellsu USERNAME图形终端下打开命令窗口自动执行的shell脚本用户登录时相关的bash配置文件全局配置文件/...
Dabric阅读 5.3k评论 3
麒麟操作系统 (kylinos) 从入门到精通 - 故障排查篇
OS平台:银河麒麟桌面操作系统(飞腾版)V10 SP1操作系统镜像:Kylin-Desktop-V10-SP1-General-Release-2203-ARM64
Oulaa赞 3阅读 1.5k
在Linux上查看活跃线程数与连接数
现如今,有两种常见的软件资源几乎成了Java后端程序的标配,即线程池与连接池,但这些池化资源非常的重要,一旦不够用了,就会导致程序阻塞、性能低下,所以有时我们需要看看它们的使用情况,以判断这里是否是瓶颈。
扣钉日记赞 3阅读 1k
9个超有用的 Linux Touch 命令实例讲解
touch 命令用于创建空文件,也用于更改 Linux 系统中现有文件的时间戳。这里更改时间戳意味着更新文件和目录的访问和修改时间。命令语法touch {options} {file}语法选项1) 创建一个空文件touch 命令创建一个空文...
鸠摩智首席音效师赞 1阅读 1.7k
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。