【正则表达式】

发布于:2025-02-21 ⋅ 阅读:(16) ⋅ 点赞:(0)

目录:

1. 背景知识

1.1 正则表达式在 Linux 中的应用场景

在 Linux 系统里,正则表达式被广泛用于各种命令行工具,以实现强大的文本处理功能。例如:

  • 文件搜索:使用 grepegrep 等工具在文件中查找符合特定模式的文本。
  • 文本替换:借助 sedawk 等工具对文本进行替换和格式化操作。
  • 数据提取:从日志文件、配置文件等大量文本数据中提取所需信息。
1.2 正则表达式引擎类型

在 Linux 环境下,常见的正则表达式引擎有基本正则表达式(BRE)和扩展正则表达式(ERE)。

  • 基本正则表达式(BRE):是最基础的正则表达式语法,一些传统的工具(如早期的 grep)默认使用这种语法。其元字符的特殊含义需要通过转义字符(如 \)来启用。
  • 扩展正则表达式(ERE):功能更强大,支持更多的元字符和语法,像 egrepsed -rawk 等工具都支持 ERE。

2. 元字符

2.1 字符匹配元字符
元字符 含义 示例(Linux 命令) 运行结果
. 匹配除换行符以外的任意单个字符 `echo “abc” grep ‘a.c’`
[] 匹配方括号内指定的任意一个字符 `echo “abc” grep ‘[ab]c’`
[^ ] 匹配不在方括号内指定的任意一个字符 `echo “abc” grep ‘[^ab]c’`
\d(ERE) 匹配任意一个数字字符,等价于 [0-9] `echo “123” egrep ‘\d+’`
2.2 数量限定元字符
元字符 含义 示例(Linux 命令) 运行结果
* 匹配前面的元素零次或多次 `echo “abbb” grep ‘ab*’`
+(ERE) 匹配前面的元素一次或多次 `echo “abbb” egrep ‘ab+’`
?(ERE) 匹配前面的元素零次或一次 `echo “ab” egrep ‘ab?’`
{n}(ERE) 匹配前面的元素恰好 n 次 `echo “aaa” egrep ‘a{3}’`
2.3 位置限定元字符
元字符 含义 示例(Linux 命令) 运行结果
^ 匹配字符串的开头 `echo “abc” grep ‘^ab’`
$ 匹配字符串的结尾 `echo “abc” grep ‘bc$’`
\b(ERE) 匹配单词边界 `echo “cat dog” egrep ‘\bcat\b’`
2.4 分组和引用元字符
元字符 含义 示例(Linux 命令) 运行结果
()(ERE) 用于分组,将多个元素视为一个整体,并可以对分组进行后向引用 `echo “abab” egrep ‘(ab)+’`
\1(ERE) 后向引用,引用前面分组的匹配结果 `echo “11” egrep ‘(\d)\1’`

3. 其他

3.1 使用 grep 进行文本搜索
  • 代码示例:在 test.txt 文件中查找包含数字的行。
echo "abc
123
def" > test.txt
grep '[0-9]' test.txt
  • 运行结果
123
3.2 使用 sed 进行文本替换
  • 代码示例:将 test.txt 文件中所有的 abc 替换为 xyz
echo "abc def" > test.txt
sed 's/abc/xyz/g' test.txt
  • 运行结果
xyz def
3.3 使用 awk 进行数据提取
  • 代码示例:从 test.txt 文件中提取每行的第一个字段。
echo "apple banana
cherry date" > test.txt
awk '{print $1}' test.txt
  • 运行结果
apple
cherry

在这里插入图片描述

1. 前言

在 Linux 系统以及各类文本处理场景中,过滤器是极为实用的工具。它们能够接收输入文本,依据特定规则对其进行处理,并输出处理后的结果。grepawksed 是其中最为常用的三个过滤器,它们在文本搜索、提取、替换等操作上各有所长。通过正则表达式与这些过滤器的结合,能够高效地完成复杂的文本处理任务。

2. 过滤器 grep

知识点

grep(Global Regular Expression Print)主要用于在文件或标准输入中查找符合指定正则表达式模式的行,并将匹配的行输出。它支持基本正则表达式(BRE)和扩展正则表达式(ERE),可以通过选项指定使用哪种模式。

代码示例

假设存在一个名为 test.txt 的文件,其内容如下:

apple
banana
cherry
date
  • 查找包含字母 a 的行
grep 'a' test.txt
  • 忽略大小写查找包含字母 A 的行
grep -i 'A' test.txt
  • 反向查找,输出不包含字母 a 的行
grep -v 'a' test.txt
运行结果
  • grep 'a' test.txt 的输出:
apple
banana
date
  • grep -i 'A' test.txt 的输出:
apple
banana
date
  • grep -v 'a' test.txt 的输出:
cherry

3. 过滤器 awk

3.1 基本概念
知识点

awk 是一种功能强大的文本处理语言,它以行为单位处理文本数据,将每行拆分为多个字段(默认以空格或制表符分隔),然后可以对这些字段进行各种操作。其基本语法为 awk 'pattern { action }' file,其中 pattern 是可选的匹配条件,action 是匹配成功后执行的操作。

代码示例

假设存在一个名为 data.txt 的文件,内容如下:

John 25 Male
Alice 22 Female
Bob 30 Male
  • 打印每行的第一个字段(姓名)
awk '{ print $1 }' data.txt
  • 打印年龄大于 25 岁的人的信息
awk '$2 > 25 { print $0 }' data.txt
运行结果
  • awk '{ print $1 }' data.txt 的输出:
John
Alice
Bob
  • awk '$2 > 25 { print $0 }' data.txt 的输出:
Bob 30 Male
3.2 深入理解
知识点

awk 有许多内置变量,如 $0 表示整行内容,$1$2 … 表示每行的第 1 个、第 2 个 … 字段,NF 表示当前行的字段数,NR 表示当前行的行号。此外,awk 还支持自定义函数和复杂的条件判断。

代码示例
  • 打印每行的字段数
awk '{ print NF }' data.txt
  • 自定义函数计算年龄总和
awk '
function sum_age(total, age) {
    return total + age;
}
{
    total = sum_age(total, $2);
}
END {
    print "年龄总和: " total;
}
' data.txt
运行结果
  • awk '{ print NF }' data.txt 的输出:
3
3
3
  • awk 'function sum_age(total, age) { return total + age; } { total = sum_age(total, $2); } END { print "年龄总和: " total; }' data.txt 的输出:
年龄总和: 77

4. 过滤器 sed

4.1 基本概念
知识点

sed(Stream Editor)是一种流编辑器,用于对文本进行替换、删除、插入等操作。它逐行读取输入文本,根据指定的命令对每行进行处理,并将处理结果输出。基本语法为 sed 'command' file

代码示例

假设存在一个名为 text.txt 的文件,内容如下:

Hello, World!
This is a test.
  • 将每行中的 is 替换为 was
sed 's/is/was/g' text.txt
  • 删除包含 test 的行
sed '/test/d' text.txt
运行结果
  • sed 's/is/was/g' text.txt 的输出:
Hello, World!
Thwas was a test.
  • sed '/test/d' text.txt 的输出:
Hello, World!
4.2 深入理解
知识点

sed 可以指定处理的行范围,支持多行操作,还可以将命令写在脚本文件中。使用 N 命令可以将下一行追加到当前行进行处理。

代码示例
  • 只替换第 2 行中的 iswas
sed '2 s/is/was/' text.txt
  • 创建脚本文件 replace.sed 并执行
# replace.sed 文件内容
s/is/was/g
sed -f replace.sed text.txt
运行结果
  • sed '2 s/is/was/' text.txt 的输出:
Hello, World!
Thwas is a test.
  • sed -f replace.sed text.txt 的输出:
Hello, World!
Thwas was a test.

表格总结

过滤器 知识点 代码示例 运行结果
grep 查找匹配行,支持 BRE 和 ERE,可通过选项控制 grep 'a' test.txt
grep -i 'A' test.txt
grep -v 'a' test.txt
包含 a 的行
忽略大小写包含 A 的行
不包含 a 的行
awk(基本) 按行处理文本,拆分字段,执行操作 awk '{ print $1 }' data.txt
awk '$2 > 25 { print $0 }' data.txt
每行第一个字段
年龄大于 25 岁的人的信息
awk(深入) 内置变量、自定义函数、复杂条件判断 awk '{ print NF }' data.txt
awk 'function sum_age(total, age) { return total + age; } { total = sum_age(total, $2); } END { print "年龄总和: " total; }' data.txt
每行字段数
年龄总和
sed(基本) 文本替换、删除操作 sed 's/is/was/g' text.txt
sed '/test/d' text.txt
替换 iswas
删除包含 test 的行
sed(深入) 指定行范围、多行操作、脚本文件 sed '2 s/is/was/' text.txt
sed -f replace.sed text.txt
只替换第 2 行的 iswas
按脚本文件替换 iswas

网站公告

今日签到

点亮在社区的每一天
去签到