模式匹配(Pattern Matching)

正如你已经知道的,Awk 逐行扫描文件,对于匹配搜索模式的行,执行对应的语句块。到目前为止,我们使用的搜索模式非常简单,例如 /gold/,但接下来,你将学习高级搜索模式

本章介绍的搜索模式是 正则表达式(Regular Expressions),它们是一组规则,用于匹配特定的字符序列。


1. 简单模式

最简单的搜索模式是 一个字符串,用斜杠 / 括起来

/The/

这个模式会匹配 任何包含 "The" 的行,但不会匹配 "the",因为 Awk 区分大小写。它也会匹配 "There""Them",因为这些单词包含 "The"

1.1 匹配行首

使用 ^(脱字符) 匹配 以特定字符串开头 的行:

/^The/

示例(匹配所有以 "The" 开头的行):

The quick brown fox   ✅ 匹配
There is a house      ✅ 匹配
My name is Thelma     ❌ 不匹配

1.2 匹配行尾

使用 $(美元符号) 匹配 以特定字符串结尾 的行:

/The$/

示例(匹配所有以 "The" 结尾的行):

That is The          ✅ 匹配
The book is mine     ❌ 不匹配

1.3 匹配特殊字符

如果要匹配特殊字符(如 ^$),需要使用 \(反斜杠) 进行转义:

/\$/

这将匹配包含 $ 符号 的行。


2. 字符集匹配

2.1 匹配多个字符

使用 方括号 [] 指定多个可选字符:

/[Tt]he/

这将匹配 "The" 或 "the",但不会匹配 "There"

也可以使用 字符范围

/[a-z]/

匹配任何小写字母。

/[a-zA-Z0-9]/

匹配 字母(大小写)或数字

2.2 取反匹配

如果 方括号内的第一个字符是 ^,则匹配不包含这些字符的内容:

/^[^a-zA-Z0-9]/

这将匹配 不以字母或数字开头的行


3. 逻辑或(Alternation)

使用 |(竖线) 进行逻辑 OR(或) 操作:

/(^Germany)|(^Netherlands)/

匹配:

Germany won the match   ✅ 匹配
Netherlands is beautiful ✅ 匹配
Italy is great          ❌ 不匹配

4. 通配符(Wildcard)

.(点号)匹配 任何单个字符

/f.n/

匹配:

fan   ✅ 匹配
fun   ✅ 匹配
fin   ✅ 匹配
fxn   ✅ 匹配

但不匹配 "faun""foin"(因为 . 只能匹配 一个 字符)。


5. 重复匹配

在 Awk 中,*+? 控制前一个字符的重复次数:

符号 作用 示例 匹配内容
* 0 或 多次 /a*/ "", "a", "aa", "aaa"
+ 至少 1 次 /a+/ "a", "aa", "aaa"(但不匹配 "")
? 0 或 1 次 /a?/ "", "a"

示例

/(ab|c)*/

匹配:

ab       ✅ 匹配
abab     ✅ 匹配
ababab   ✅ 匹配
c        ✅ 匹配
cc       ✅ 匹配
ccc      ✅ 匹配
abc      ✅ 匹配
ababc    ✅ 匹配

6. 精确匹配重复次数

使用 {}(大括号) 指定重复次数:

/f[eo]{2}t/

匹配:

foot ✅ 匹配
feet ✅ 匹配
fot  ❌ 不匹配

匹配至少 3 位数字

/[0-9]{3,}/

等价于:

/[0-9][0-9][0-9]+/

匹配 4 到 7 位数字

/^[0-9]{4,7}$/

匹配:

1234   ✅ 匹配
567890 ✅ 匹配
1      ❌ 不匹配(太短)
12345678 ❌ 不匹配(太长)

7. 练习

如果你不熟悉正则表达式,请尝试编写一些表达式并测试它们。

  1. 匹配美国 ZIP 代码

    5 位数字,或 5 位数字+连字符+4 位数字(如 12345 或 12345-6789)
    
    /^[0-9]{5}(-[0-9]{4})?$/
    
  2. 匹配数字(包括小数)

    允许整数或带小数点的数(如 123、45.6、0.78)
    
    /^[+-]?[0-9]+(\.[0-9]+)?$/
    
  3. 匹配电子邮件地址

    电子邮件格式:xxx@yyy.zzz(如 user_123@example.com)
    
    /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/
    
  4. 匹配电话号码

    允许 (123) 456-7890、123-456-7890、1234567890
    
    /^(\([0-9]{3}\)|[0-9]{3})[- ]?[0-9]{3}[- ]?[0-9]{4}$/
    

在下一章,你将学习更多 高级搜索模式 以及如何在 Awk 中结合模式匹配和数据处理。

最后修改: 2025年01月30日 星期四 01:13