程序锅

  • 首页
  • 分类
  • 标签
  • 归档
  • 关于

  • 搜索
基础知识 Etcd LeetCode 计算机体系结构 Kubernetes Containerd Docker 容器 云原生 Serverless 项目开发维护 ELF 深入理解程序 Tmux Vim Linux Kernel Linux numpy matplotlib 机器学习 MQTT 网络基础 Thrift RPC OS 操作系统 Clang 研途 数据结构和算法 Java 编程语言 Golang Python 个人网站搭建 Nginx 计算机通用技术 Git

Linux Cheat Sheet - 正则表达式和通配符

发表于 2020-10-11 | 分类于 Linux | 0 | 阅读次数 3501

正则表达式和通配符

基本的正则表达式

正则表达式和通配符是完全不一样的东西。通配符代表的是 bash 操作接口的一个功能,而正则表达式则是一种字符串处理的表达方式。

# 基础的正则表达式

* 匹配前面一个普通字符的 0 次或多次	
# Hel*o  可以是 helllllo 也可以是 heo 这个要注意

. 匹配任意一个字符,但注意只是一个	
# …43  也就是 xxd43 sda43 12343都可以
# .* 就代表 0 个或者多个任意字符了,比如 g.*g

^ 匹配行首,行首就是 ^ 后面的字符	
# ^cloud 也就是匹配行首为 cloud 的行
# 用在 [] 里面表示取反

$ 匹配行尾					
# Cloud$ 也就是匹配行尾为 cloud 的行,^$ 就是空行匹配行首和行尾

[] 匹配字符集合,只取其中一个字符
# [01234]
# [0-4] 等价于 [01234]
# [^a-z] 在这里 ^ 表示取反,也就是除了 a-z 的所有字符
# [A-Za-z]* 以任意一个字母开头,可以0次或多次重复 匹配任何英文单词

\{\} 和 * 类似,表示前一个字符的重复但是更加精确,有两个 \ 是因为要转义 <>
# \{n\}重复n次
# \{n,\} 至少重复n次
# \{n, m\} 重复n-m次

\<\> 精确匹配 
# \<the\> 只找 the 这个单词,包含 the 的都不算

正则表达式扩展

# 正则表达式扩展

? 匹配前一个字符 0 次或 1 次
# JO?B 也就是 JOB 或者 JOOB

+ 匹配前一个字符 1 或多次
# S+EU 也就是 SSEU  SSSSSSEU

| 表示或的方式找出数个字符串
# gd|good 就是 gd 或者 good 
# gd|good|dog 就是 gd 或者 good 或者 dog

() 找出组字符串
# g(la|oo)d 就是 glad 或者 good
# A(XY)+Z 就是 AXYZ 或者 AXYXYZ

通配符

# 通配符(不同正则,通配符是 shell 里面会用到的)

* 代表任意位任意字符
? 代表任意一个字符
^ 代表取反
[] 同正则表达式
{} 表示的是一个通配集合,用逗号隔开,表示或的关系

ls -l [a-h]*.h # a-h 字母开头的 .h 文件
ls -l [a-h]*.[^h]* # a-h 字母开头的,非 .h 结尾的文件

{[a-h]*.h, g?.h} # 代表 a-h 字母开头的 .h 文件或者 g 开头的两个字符的 .h 文件

在不支持正则表达式的工具中,比如 ls,那么 ls -l *, 代表的是任意文件名,ls -l a* 表示以 a 为开头的任何文件名。但是要在正则表达式中找到含有以 a 为开头的,那需要 ls | grep '^l'。

特殊符号

为了避免语系所造成的英文与数字的撷取问题,我们可以使用一些特殊符号。下面是这些特殊符号及其代表的意思。

特殊符号代表意义
[:alnum:]代表英文大小写字符及数字,亦即 0-9, A-Z, a-z
[:alpha:]代表任何英文大小写字符,亦即 A-Z, a-z
[:blank:]代表空白键与 [Tab] 按键两者
[:cntrl:]代表键盘上面的控制按键,亦即包括 CR, LF, Tab, Del.. 等等
[:digit:]代表数字而已,亦即 0-9
[:graph:]除了空白字符 (空白键与 [Tab] 按键) 外的其他所有按键
[:lower:]代表小写字符,亦即 a-z
[:print:]代表任何可以被打印出来的字符
[:punct:]代表标点符号 (punctuation symbol),亦即:" ' ? ! ; : # $...
[:upper:]代表大写字符,亦即 A-Z
[:space:]任何会产生空白的字符,包括空白键, [Tab], CR 等等
[:xdigit:]代表 16 进位的数字类型,因此包括: 0-9, A-F, a-f 的数字与字符

什么是语系的问题呢?文件本质上是由 0 和 1 组成的,我们看到的字符文字和数字都是通过编码表转换而来的。那么不同语系的编码数据并不相同,所以就会造成数据选取结果的区别了。比如,在英文大小写的编码顺序中,zh_CN.big5 及 C 这两种语系的输出结果如下所示:

  • LANG=C 时:0 1 2 3 4 ... A B C D ... Z a b c ... z
  • LANG=zh_CN 时:0 1 2 3 4 ... a A b B ... z Z

从中可以看到,这两种语系明显是不一样的。在选取大写字符而使用 [A-Z] 时,假如使用的是 C 语系的话,那么可以正确找到大写字符,但是假如使用的是 zh_CN.gb2313 的时候就会发现,小写的 b-z 也会被选取进来。因此,在使用正则表达式时,需要特别留意当时环境的语系为何, 否则可能会发现与别人不相同的选取结果喔。那么针对这个问题的话,我们就可以使用上述那些特殊符号,如下所示。

[A-Z] 等同于 [[:upper:]]
[^A-Z] 等同于 [^[:upper:]] 

当然一般情况下使用正则表达式时,使用的都是兼容于 “POSIX” 的标准,因此使用 C 这个语系也可。但是上述的特殊符号也需要了解哦。

卷死我
dawnguo 微信支付

微信支付

dawnguo 支付宝

支付宝

  • 本文作者: dawnguo
  • 本文链接: /archives/99
  • 版权声明: 本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0 许可协议。转载请注明出处!
# Linux
容器 | 这次终于搞懂 Docker 网络了
A Tour of Go
  • 文章目录
  • 站点概览
dawnguo

dawnguo

215 日志
24 分类
37 标签
RSS
Creative Commons
© 2018 — 2025 程序锅
0%