正则表达式完全指南:从入门到实战应用

目录

[1. 正则表达式基础概念](#1. 正则表达式基础概念)

什么是正则表达式

最简单的正则表达式:完全匹配

[2. 行首和行尾匹配](#2. 行首和行尾匹配)

行定位符元字符

行首匹配示例

行尾匹配示例

精确匹配整个行

[3. 通配符和重复匹配](#3. 通配符和重复匹配)

通配符(.)

字符集匹配(\[\])

[重复匹配 - 星号(*)](#重复匹配 - 星号(*))

精确重复匹配

[4. 基本正则表达式 vs 扩展正则表达式](#4. 基本正则表达式 vs 扩展正则表达式)

主要区别

常用元字符对照表

重复匹配元字符

字符类元字符

单词边界元字符

[5. grep命令常用选项](#5. grep命令常用选项)

常用选项表

忽略大小写示例

反向匹配示例

排除注释行

多模式搜索

[6. 在编辑器中搜索](#6. 在编辑器中搜索)

vim编辑器搜索

less查看器搜索

总结


1. 正则表达式基础概念

什么是正则表达式

正则表达式是一种强大的模式匹配工具,用于在文本中查找、替换符合特定模式的字符串。它被广泛应用于:

  • 文本编辑器(vim、less)

  • 命令行工具(grep、sed、awk)

  • 编程语言(Perl、Python、C)

最简单的正则表达式:完全匹配

最基本的正则表达式就是完全匹配搜索的字符串

示例数据文件内容:

bash 复制代码
cat
dog
concatenate
dogma
category
educated
boondoggle
vindication
childog

搜索命令:

bash 复制代码
grep 'cat' filename

注:匹配指定文件里的内容

匹配结果:

bash 复制代码
cat
concatenate
category
educated
vindication

解析:

  • 搜索包含连续字符"cat"的所有行

  • 不要求"cat"是独立的单词

  • 只要字符串中包含"cat"就会被匹配


2. 行首和行尾匹配

行定位符元字符

  • ^:匹配行首

  • $:匹配行尾

行首匹配示例

bash 复制代码
grep '^cat' filename

匹配结果:

bash 复制代码
cat
category

解析:

  • ^cat 只匹配以"cat"开头的行

  • 排除了"concatenate"、"educated"等包含"cat"但不是行首的单词

行尾匹配示例

bash 复制代码
grep 'cat$' filename

匹配结果:

bash 复制代码
cat

解析:

  • cat$ 只匹配以"cat"结尾的行

  • 只有独立的"cat"行符合条件

精确匹配整个行

bash 复制代码
grep '^cat$' filename

匹配结果:

bash 复制代码
cat

解析:

  • ^cat$ 要求整行就是"cat"

  • 同时满足行首和行尾的条件


3. 通配符和重复匹配

通配符(.)

点字符 . 匹配任意单个字符

示例:

bash 复制代码
grep 'c.t' filename

匹配:catcutc$t

  • c.t 匹配c + 任意字符 + t

字符集匹配(\[\])

使用方括号匹配特定字符

示例:

bash 复制代码
grep 'c[aou]t' filename

匹配:catcotcut

  • [aou] 匹配a、o或u中的任意一个

重复匹配 - 星号(*)

* 匹配前一个字符的零次或多次重复

示例1:

bash 复制代码
grep 'c[aou]*t' filename

匹配:coatcoot

  • [aou]* 匹配a、o、u的零次或多次出现

示例2:

bash 复制代码
grep 'c.*t' filename

匹配:catcoatculvertct

  • .* 匹配任意字符的零次或多次出现

精确重复匹配

bash

复制代码
grep 'c.\{2\}t' filename

匹配结果:

bash 复制代码
coat
cart

解析:

  • .\{2\} 匹配恰好两个任意字符

  • 在基本正则表达式中需要使用转义符\


4. 基本正则表达式 vs 扩展正则表达式

主要区别

特性 基本正则表达式 扩展正则表达式
特殊字符 需要转义 默认有特殊含义
命令 grep、sed、vim grep -E、sed -E、less

常用元字符对照表

重复匹配元字符
功能 基本语法 扩展语法
可选匹配 \? ?
零次或多次 * *
一次或多次 \+ +
精确n次 \{n\} {n}
n次或更多 \{n,\} {n,}
最多m次 \{,m\} {,m}
n到m次 \{n,m\} {n,m}
字符类元字符
字符类 描述
[[:alnum:]] 字母数字字符
[[:alpha:]] 字母字符
[[:blank:]] 空白字符(空格、制表符)
[[:print:]] 可打印字符
[[:punct:]] 标点符号字符
[[:space:]] 空格字符
[[:upper:]] 大写字母
[[:xdigit:]] 十六进制数字
单词边界元字符
元字符 描述
\b 匹配词语两侧的空字符串
\B 匹配词语中间的空字符串
\< 匹配词语开头
\> 匹配词语末尾
\w 匹配词语组分(等同[[:alnum:]_]
\W 匹配非词语组分
\s 匹配空格

5. grep命令常用选项

常用选项表

选项 功能描述
-i 忽略大小写
-v 反向匹配(显示不包含模式的行)
-r 递归搜索目录
-A NUMBER 显示匹配行后的NUMBER行
-B NUMBER 显示匹配行前的NUMBER行
-e 指定多个模式(逻辑OR)
-E 使用扩展正则表达式

忽略大小写示例

bash 复制代码
[user@host ~]$ grep -i serverroot /etc/httpd/conf/httpd.conf
# with "/", the value of ServerRoot is prepended -- so 'log/access_log'
# with ServerRoot set to '/www' will be interpreted by the
# ServerRoot: The top of the directory tree under which the server's
# ServerRoot at a non-local disk, be sure to specify a local disk on the
# same ServerRoot for multiple httpd daemons, you will need to change at
ServerRoot "/etc/httpd"

解析:

  • -i 选项使搜索不区分大小写

  • 匹配"serverroot"、"ServerRoot"等各种大小写组合

反向匹配示例

bash 复制代码
[user@host ~]$ grep -v -i server /etc/hosts
127.0.0.1 localhost.localdomain localhost
172.25.254.254 classroom.example.com classroom
172.25.254.254 content.example.com content
172.25.254.254 materials.example.com materials
### rht-vm-hosts file listing the entries to be appended to /etc/hosts
172.25.250.9 workstation.lab.example.com workstation
172.25.250.254 bastion.lab.example.com bastion
172.25.250.220 utility.lab.example.com utility
172.25.250.220 registry.lab.example.com registry

解析:

  • -v 显示不包含模式的行

  • -i 忽略大小写

  • 过滤掉所有包含"server"(不区分大小写)的行

排除注释行

bash 复制代码
[user@host ~]$ grep -v '^[#;]' /etc/systemd/system/multi-user.target.wants/rsyslog.service
[Unit]
Description=System Logging Service
Documentation=man:rsyslogd(8)
Documentation=https://www.rsyslog.com/doc/
[Service]
Type=notify
EnvironmentFile=-/etc/sysconfig/rsyslog
ExecStart=/usr/sbin/rsyslogd -n $SYSLOGD_OPTIONS
ExecReload=/usr/bin/kill -HUP $MAINPID
UMask=0066
StandardOutput=null
Restart=on-failure
LimitNOFILE=16384
[Install]
WantedBy=multi-user.target

解析:

  • ^[#;] 匹配以#或;开头的行

  • -v 排除这些注释行

  • 只显示配置文件的有效内容

多模式搜索

bash 复制代码
[root@host -]# cat /var/log/secure | grep -e 'pam_unix' -e 'user root' -e 'Accepted publickey' | less
Mar  4 03:31:41 localhost passwd[6639]: pam_unix(passwd:chauthtok): password changed for root
Mar  4 03:32:34 localhost sshd[15556]: Accepted publickey for devops from 10.30.0.167 port 56472 ssh2: RSA SHA256:M8ikhcEDm2tQ952007ZvufqEixCFCt+wOWZLNzNIBT0
Mar  4 03:32:34 localhost systemd[15560]: pam_unix(systemd-user:session): session

解析:

  • -e 选项指定多个搜索模式

  • 使用逻辑OR关系,匹配任意一个模式

  • 在系统安全日志中查找认证相关事件


6. 在编辑器中搜索

vim编辑器搜索

bash 复制代码
[root@host ~]# vim /var/log/boot.log

在vim中:

  • / 进入搜索模式

  • 输入搜索模式

  • Enter 开始搜索

  • n 查找下一个匹配项

less查看器搜索

bash 复制代码
[root@host ~]# less /var/log/messages

在less中:

  • 同样使用 / 开始搜索

  • n 查找下一个

  • N 查找上一个


总结

正则表达式是文本处理的强大工具,通过掌握:

  1. 基础匹配:完全匹配、行首行尾定位

  2. 通配符:单个字符、字符集匹配

  3. 重复匹配:零次或多次、精确次数等

  4. grep选项:忽略大小写、反向匹配、多模式搜索

  5. 编辑器集成:vim、less中的搜索功能

相关推荐
A小辣椒1 小时前
TShark:基础知识
linux
AlfredZhao3 小时前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao18 小时前
vi 删除指定范围的行,不用再反复按 dd
linux·vi
用户9718356334661 天前
银河麒麟 KY10 申威(SW64) 安装 nginx-1.16.1-2.p01.ky10.sw_64.rpm 详细步骤
linux
猪脚踏浪1 天前
linux 拷贝文件或目录到指定的位置
linux
摇滚侠2 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
bush42 天前
嵌入式linux学习记录十四、术语
linux·嵌入式
载数而行5202 天前
Linux 11 动态监控指令top
linux
不会C语言的男孩2 天前
Linux 系统编程 · 第 8 章:进程基础
linux·c语言
古城小栈2 天前
Unix 与 Linux 异同小叙
linux·服务器·unix