十二、Linux Shell脚本:正则表达式

简介: 正则表达式就是一套给文本“相亲”的规则,让你不再只能找“张三”,而是能找到所有“姓张、两个字、且名字里不带'伟'”的人。它通过一些“魔术符号”(元字符)来描述模式:比如 . 代表任意字符,* 代表重复任意次,^ 和 $ 则卡住行头行尾。把这些符号组合起来,你就能用grep或sed等工具,从海量文本里精确地捞出你想要的任何格式的数据。

正则表达式的本质是一套用于描述和匹配字符串集合规则模式语言 它通过组合普通字符和具有特殊含义元字符定义一个“模板”,然后用这个模板去文本中进行模式匹配

一、基本匹配 (字面量匹配)

最基础的正则表达式就是字符串本身,它会精确匹配文本中完全相同的字符序列。

代码示例 (使用 grep 命令演示):

# 在字符串中查找 "cat"
echo "My cat is black, your cat is white." | grep --color=always 'cat'
(--color=always 用于高亮匹配部分。为防止Shell对特殊字符进行解释,强烈建议将正则表达式用单引号 '' 包裹。)

二、核心元字符

正则表达式的威力来源于元字符,这些字符不再代表字面含义,而是被赋予了特殊的匹配功能

1.. (点) - 匹配任意单个字符

一个点 . 可以代表除换行符外任何一个字符。

# 匹配 "c" 和 "t" 之间有任意一个字符的模式
echo "cat cot c-t c@t chart" | grep --color=always 'c.t'
# 将匹配 cat, cot, c-t, c@t

2.* (星号) - 匹配前一个元素零次或多次

星号 * 表示其紧邻的前一个字符或分组可以出现任意次数 (0, 1, 2, ...)。

# 匹配 "go" 和 "gle" 之间有任意数量 "o" 的模式
echo "ggle google goooogle gogle" | grep --color=always 'go*gle'
# 将匹配 ggle (o出现0次), google, goooogle

3.+ (加号) - 匹配前一个元素一次或多次

加号 + 与星号类似,但要求其前一个元素至少出现一次 (1, 2, 3, ...)。

# 匹配 "go" 和 "gle" 之间至少有一个 "o" 的模式
echo "ggle google goooogle gogle" | grep -E --color=always 'go+gle'
# 将匹配 google, goooogle,但不匹配 ggle
注意 - 正则表达式方言 (Flavor):
+, ?, |, () 等元字符,在 基础正则表达式 (BRE) 中 (如标准 grep) 需要前置反斜杠 \ (如 \+) 才能生效。而在 扩展正则表达式 (ERE) 中 (如 grep -Eegrep) 则 直接使用。为 方便和现代,本教程的示例 主要使用 ERE

### 4.? (问号) - 匹配前一个元素零次或一次
问号 ? 表示其 前一个元素是 可选的
bash # 匹配 "color" 和 "colour" echo "color colour counselor" | grep -E --color=always 'colou?r'

### 5.^ (尖角号) - 匹配行首
^ 位于 正则表达式的开头时,它 锚定匹配必须从 一行的开始处发生。
bash # 匹配以 "start" 开头的行 echo -e "start of the line\nmiddle start end" | grep -E --color=always '^start' # 只会匹配第一行

### 6.$ (美元符) - 匹配行尾
$ 位于 正则表达式的末尾时,它 锚定匹配必须在 一行的结束处结束。
bash # 匹配以 "end" 结尾的行 echo -e "the line must end\nend of the line" | grep -E --color=always 'end$' # 只会匹配第一行
组合使用 ^$ 可以进行 整行匹配。例如 ^root$ 只匹配 内容仅为 "root" 的行。

### 7.[...] (方括号) - 匹配字符集合
方括号 [...] 定义了一个 字符集,它会匹配 集合内任意一个字符。
> [abc]: 匹配 'a', 'b', 'c' 中的 一个
[0-9]: 匹配 任意一个数字。
[a-z]: 匹配 任意一个小写字母。
[a-zA-Z]: 匹配 任意一个字母。
[^abc]: (当 ^在方括号 内开头时) 反向匹配,匹配 除 'a', 'b', 'c' 之外的任意一个字符。
bash # 匹配 "log" 后跟任意一个数字,然后是 ".txt" echo "log1.txt logA.txt log-3.txt" | grep -E --color=always 'log[0-9]\.txt' # 将匹配 log1.txt

### 8.\ (反斜杠) - 转义元字符
反斜杠 \ 用于 去除其后 元字符的特殊含义,使其 变回字面字符。例如,要匹配一个 真正的点 .,必须写成 \.

## 三、量词与分组

1. 精确量词 {}

花括号 {} 用于精确控制前一个元素重复次数

  • {n}: 正好 n 次。
  • {n,}: 至少 n 次。
  • {n,m}: n 到 m 次 (包含n和m)。
    # 匹配一个4位数的年份
    echo "Date: 2024, Item: 123" | grep -E --color=always '[0-9]{4}'
    # 将匹配 2024
    

2. 分组 () 与或 |

  • 圆括号 (): 将多个字符组合成一个逻辑单元,可以对整个单元应用量词。默认情况下,() 还会捕获其匹配到的内容,用于后续引用
  • 竖线 |: 表示“或”关系,匹配其左边或右边的表达式。
# 匹配 "file.log" 或 "file.txt"
echo "file.log file.txt file.dat" | grep -E --color=always 'file\.(log|txt)'

# 匹配 "http://" 或 "https://", 后跟任意字符
echo "URL: https://example.com" | grep -E --color=always '(http|https)://.*'

四、常见应用场景与工具

正则表达式在Linux命令行中无处不在

  • grep: 文本搜索
  • sed: 流编辑器,用于文本替换和转换。
  • awk: 强大的文本处理语言。
  • find: -regex 选项支持基于路径的正则匹配
  • 文本编辑器: vim, emacs 等都内置了强大的正则搜索/替换功能。
  • 编程语言: Python (re), Perl, JavaScript (RegExp), Java (java.util.regex) 等几乎所有语言都提供了正则库。

五、更多信息

  • POSIX 字符类: 为了更好的可移植性对非ASCII字符的支持,可以使用 [[:...:]] 形式的字符类,例如 [[:digit:]] 等同于 [0-9][[:alpha:]] 等同于 [a-zA-Z]
  • 贪婪与非贪婪匹配: 默认情况下,像 *+ 这样的量词是贪婪的,即它们会尽可能多地匹配字符。在支持PCRE (Perl Compatible Regular Expressions) 的引擎中 (如 grep -P),可以在量词后添加 ? (如 *?, +?) 来切换到非贪婪模式,即尽可能少地匹配。
总结: 正则表达式是 处理和分析文本数据的 基石。从 简单的字面量匹配,到 组合使用元字符、量词、分组和锚点,可以 构建出极其 精确和灵活匹配模式。熟练掌握 正则表达式极大地提升你在 命令行脚本编程中的 工作效率

---

## 练习题

题目一:基本匹配与元字符
写一个正则表达式,匹配包含 colorcolour 这两个单词的行。

题目二:数字匹配
写一个正则表达式,匹配一个三位数的整数。

题目三:开头与结尾
写一个正则表达式,匹配以大写字母开头,并且以句号 . 结尾的整行。

题目四:字符集合
写一个正则表达式,匹配一个小写元音字母 (a, e, i, o, u)。

题目五:量词
写一个正则表达式,匹配一个由至少两个数字组成的字符串。

题目六:转义
写一个正则表达式来精确匹配字符串 127.0.0.1

题目七:分组与或
写一个正则表达式,匹配 apple.jpgapple.png

题目八:综合应用 (简单邮箱格式)
写一个非常简化的正则表达式,尝试匹配类似 user@example.com 格式的字符串(假设用户名和域名只包含字母、数字、下划线,并且域名只有两部分)。

题目九:反向匹配
写一个正则表达式,匹配不包含任何数字的行。

题目十:POSIX字符类
使用POSIX字符类,写一个正则表达式,匹配一个或多个十六进制字符 (0-9, a-f, A-F)。

答案与解析

答案一:

colou?r
  • 解析: ? 量词表示其前一个字符 (u) 可以出现0次或1次,因此可以同时匹配 colorcolour

答案二:

[0-9]{3}
  • 解析: [0-9] 匹配任意一个数字{3} 这个量词表示前面的元素必须正好出现3次。如果要求整行就是三位数,应写成 ^[0-9]{3}$

答案三:

^[A-Z].*\.$
  • 解析: ^ 匹配行首[A-Z] 匹配一个大写字母.* 匹配任意数量的任意字符,\. 匹配一个字面上的点$ 匹配行尾

答案四:

[aeiou]
  • 解析: [...] 字符集会匹配其中列出任意一个字符。

答案五:

[0-9]{2,}
  • 解析: {2,} 量词表示前面的元素 ([0-9]) 必须出现至少2次

答案六:

127\.0\.0\.1
  • 解析: IP地址中的.元字符,必须使用反斜杠 \ 进行转义,才能匹配其字面含义

答案七:

apple\.(jpg|png)
  • 解析: \. 匹配(jpg|png) 使用分组 ()| 来匹配 jpgpng 字符串。

答案八:

[a-zA-Z0-9_]+@[a-zA-Z0-9_]+\.[a-zA-Z0-9_]+
  • 解析: [a-zA-Z0-9_]+ 匹配至少一个字母、数字或下划线,用于匹配用户名域名部分@\. 匹配字面符号。这是一个简化模型

答案九:

^[^0-9]*$
  • 解析: ^$ 锚定整行[^0-9] 是一个反向字符集,匹配任何非数字字符。* 表示这些非数字字符可以出现任意次数 (包括0次,以匹配空行)。

答案十:

[[:xdigit:]]+
  • 解析: [[:xdigit:]]POSIX字符类,专门用于匹配十六进制字符 (等效于 [0-9a-fA-F])。+ 表示匹配一次或多次。使用POSIX字符类可读性更好兼容性更强
目录
相关文章
|
7天前
|
人工智能 数据可视化 安全
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
本文详解如何用阿里云Lighthouse一键部署OpenClaw,结合飞书CLI等工具,让AI真正“动手”——自动群发、生成科研日报、整理知识库。核心理念:未来软件应为AI而生,CLI即AI的“手脚”,实现高效、安全、可控的智能自动化。
34477 17
王炸组合!阿里云 OpenClaw X 飞书 CLI,开启 Agent 基建狂潮!(附带免费使用6个月服务器)
|
19天前
|
人工智能 JSON 机器人
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
本文带你零成本玩转OpenClaw:学生认证白嫖6个月阿里云服务器,手把手配置飞书机器人、接入免费/高性价比AI模型(NVIDIA/通义),并打造微信公众号“全自动分身”——实时抓热榜、AI选题拆解、一键发布草稿,5分钟完成热点→文章全流程!
45307 142
让龙虾成为你的“公众号分身” | 阿里云服务器玩Openclaw
|
8天前
|
人工智能 JSON 监控
Claude Code 源码泄露:一份价值亿元的 AI 工程公开课
我以为顶级 AI 产品的护城河是模型。读完这 51.2 万行泄露的源码,我发现自己错了。
4872 21
|
1天前
|
人工智能 自然语言处理 安全
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
本文介绍了Claude Code终端AI助手的使用指南,主要内容包括:1)常用命令如版本查看、项目启动和更新;2)三种工作模式切换及界面说明;3)核心功能指令速查表,包含初始化、压缩对话、清除历史等操作;4)详细解析了/init、/help、/clear、/compact、/memory等关键命令的使用场景和语法。文章通过丰富的界面截图和场景示例,帮助开发者快速掌握如何通过命令行和交互界面高效使用Claude Code进行项目开发,特别强调了CLAUDE.md文件作为项目知识库的核心作用。
1971 6
Claude Code 全攻略:命令大全 + 实战工作流(建议收藏)
|
7天前
|
人工智能 API 开发者
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案
阿里云百炼Coding Plan Lite已停售,Pro版每日9:30限量抢购难度大。本文解析原因,并提供两大方案:①掌握技巧抢购Pro版;②直接使用百炼平台按量付费——新用户赠100万Tokens,支持Qwen3.5-Max等满血模型,灵活低成本。
1813 5
阿里云百炼 Coding Plan 售罄、Lite 停售、Pro 抢不到?最新解决方案