正则表达式与文本处理实用指南
立即解锁
发布时间: 2025-08-14 01:38:26 阅读量: 5 订阅数: 12 


Linux命令行完全入门指南
# 正则表达式与文本处理实用指南
## 1. 正则表达式基础与实践
### 1.1 正则表达式匹配示例
我们先来看几个正则表达式匹配的示例。使用 `grep -E` 命令结合正则表达式来验证输入的字符串是否符合特定模式。
```bash
[me@linuxbox ~]$ echo "This that" | grep -E '^([[:alpha:]]+ ?)+$'
This that
[me@linuxbox ~]$ echo "a b c" | grep -E '^([[:alpha:]]+ ?)+$'
a b c
[me@linuxbox ~]$ echo "a b 9" | grep -E '^([[:alpha:]]+ ?)+$'
[me@linuxbox ~]$ echo "abc d" | grep -E '^([[:alpha:]]+ ?)+$'
[me@linuxbox ~]$
```
从上述示例可以看出,正则表达式 `^([[:alpha:]]+ ?)+$` 用于匹配只包含字母且单词间最多一个空格的字符串。“a b 9” 因包含非字母字符而不匹配,“abc d” 因单词间有多个空格也不匹配。
### 1.2 指定匹配次数的元字符 `{}`
`{}` 元字符用于指定匹配元素的最小和最大次数,有以下四种指定方式:
| 指定符 | 含义 |
| ---- | ---- |
| `{n}` | 匹配前一个元素恰好出现 n 次 |
| `{n,m}` | 匹配前一个元素至少出现 n 次,但不超过 m 次 |
| `{n,}` | 匹配前一个元素出现 n 次或更多次 |
| `{,m}` | 匹配前一个元素出现不超过 m 次 |
以电话号码的正则表达式为例,我们可以使用这种指定重复次数的方法简化表达式:
原始表达式:`^\(?[0-9][0-9][0-9]\)? [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9]$`
简化后:`^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$`
下面是验证示例:
```bash
[me@linuxbox ~]$ echo "(555) 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
(555) 123-4567
[me@linuxbox ~]$ echo "555 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
555 123-4567
[me@linuxbox ~]$ echo "5555 123-4567" | grep -E '^\(?[0-9]{3}\)? [0-9]{3}-[0-9]{4}$'
[me@linuxbox ~]$
```
简化后的表达式能成功验证带或不带括号的电话号码,同时拒绝格式不正确的号码。
### 1.3 正则表达式在命令中的应用
#### 1.3.1 使用 `grep` 验证电话列表
我们可以创建一个包含多个电话号码的文件,然后使用 `grep` 来验证这些号码的格式。
创建电话列表文件的命令如下:
```bash
[me@linuxbox ~]$ for i in {1..10}; do echo "(${RANDOM:0:3}) ${RANDOM:0:3}-${RANDOM:0:4}" >> phonelist.txt; done
```
查看文件内容:
```bash
[me@linuxbox ~]$ cat phonelist.txt
(232) 298-2265
(624) 381-1078
(540) 126-1980
(874) 163-2885
(286) 254-2860
(292) 108-518
(129) 44-1379
(458) 273-1642
(686) 299-8268
(198) 307-2440
```
可以看到部分号码格式不正确,使用 `grep -Ev` 命令找出这些无效号码:
```bash
[me@linuxbox ~]$ grep -Ev '^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$' phonelist.txt
(292) 108-518
(129) 44-1379
[me@linuxbox ~]$
```
这里使用 `-v` 选项进行反向匹配,只输出不匹配指定表达式的行。
#### 1.3.2 使用 `find` 查找不规则文件名
`find` 命令支持基于正则表达式的测试。使用以下命令查找包含非 `[-_./0-9a-zA-Z]` 字符的路径名:
```bash
[me@linuxbox ~]$ find . -regex '.*[^-_./0-9a-zA-Z].*'
```
由于需要精确匹配整个路径名,我们在表达式两端使用 `.*` 来匹配任意字符的零个或多个实例。
#### 1.3.3 使用 `locate` 搜索文件
`locate` 程序支持基本(`--regexp` 选项)和扩展(`--regex` 选项)正则表达式。使用以下命令搜索包含 `bin/(bz|gz|zip)` 的路径名:
```bash
[me@linuxbox ~]$ locate --regex 'bin/(bz|gz|zip)'
/bin/bzcat
/bin/bzcmp
/bin/bzdiff
/bin/bzegrep
/bin/bzexe
/bin/bzfgrep
/bin/bzgrep
/bin/bzip2
/bin/bzip2recover
/bin/bzless
/bin/bzmore
/bin/gzexe
/bin/gzip
/usr/bin/zip
/usr/bin/zipcloak
/usr/bin/zipgrep
/usr/bin/zipinfo
/usr/bin/zipnote
/usr/bin/zipsplit
```
#### 1.3.4 使用 `less` 和 `vim` 搜索文本
`less` 和 `vim` 都支持使用正则表达式搜索文本。在 `less` 中,按下 `/` 键后输入正则表达式进行搜索。例如,查看 `phonelist.txt` 文件并搜索验证表达式:
```bash
[me@linuxbox ~]$ less phonelist.txt
```
在 `less` 中输入 `/^\([0-9]{3}\) [0-9]{3}-[0-9]{4}$` 进行搜索,匹配的字符串会被高亮显示。
在 `vim` 中,由于它支持基本正则表达式,搜索表达式需要进行一些调整:
```bash
/([0-9]\{3\}) [0-9]\{3\}-[0-9]\{4\}
```
如果 `vim` 没有自动高亮匹配结果,可以使用 `:hlsearch` 命令激活搜索高亮。
### 1.4 查找使用正则表达式的应用
我们可以通过搜索 `man` 页面来查找更多使用正则表达式的应用:
```bash
[me@linuxbox ~]$ cd /usr/share/man/man1
[me@linuxbox man1]$ zgrep -El 'regex|regular expression' *.gz
```
`zgrep` 程序为 `grep` 提供了一个前端,允许它读取压缩文件。该命令会输出包含 “regex” 或 “regular expression” 的文件列表。
## 2. 文本处理工具与应用
### 2.1 文本处理工具概述
Unix 类操作系统大量依赖文本文件进行数据存储,因此有许多用于处理文本的工具,包括:
- `cat`:连接文件并输出到标准输出。
- `sort`:对文本文件的行进行排序。
- `uniq`:报告或忽略重复的行。
- `cut`:从文件的每行中删除部分内容。
- `paste`:合并文件的行。
- `join`:根据公共字段连接两个文件的行。
- `comm`:逐行比较两个已排序的文件。
- `diff`:逐行比较文件。
- `patch`:将差异文件应用到原始文件。
- `tr`:翻译或删除字符。
- `sed`:用于过滤和转换文本的流编辑器。
- `aspell`:交互式拼写检查器。
### 2.2 文本的应用场景
#### 2.2.1 文档编写
许多人使用纯文本格式编写文档,通过标记语言描述文档的格式。许多科学论文采用这种方法编写,因为基于 Unix 的文本处理系统支持技术领域作者所需的高级排版布局。
#### 2.2.2 网页
网页是最流行的电子文档类型,使用 HTML 或 XML 作为标记语言来描述文档的视觉格式。
#### 2.2.3 电子邮件
电子邮件本质上是基于文本的媒介,即使是非文本附件也会转换为文本表示进行传输。
#### 2.2.4 打印机输出
在 Unix 类系统中,打印输出以纯文本形式发送,或者如果页面包含图形,则转换为名为 PostScript 的文本格式页面描述语言,然后发送到生成打印图形点的程序。
#### 2.2.5 程序源代码
所有软件最初都是以文本形式存在的,源代码始终是文本格式,因此文本处理对软件开发人员非常重要。
### 2.3 常用文本处理命令详解
#### 2.3.1 `cat` 命令
`cat` 命令有许多有趣的选项,例如 `-A` 选项用于显示文本中的非打印字符。创建一个测试文件并使用 `-A` 选项查看:
```bash
[me@linuxbox ~]$ cat > foo.txt
The quick brown fox jumped over the lazy dog.
[me@linuxbox ~]$ cat -A foo.txt
^IThe quick brown fox jumped over the lazy dog. $
[me@linuxbox ~]$
```
结果中,`^I` 表示制表符,`$` 表示行尾有空格。
`cat` 还有 `-n`(给行编号)和 `-s`(抑制多个空行输出)选项。示例如下:
```bas
```
0
0
复制全文
相关推荐









