Shell 编程 —— 正则表达式与文本处理器

目录

一. 正则表达式

1.1 定义

1.2 用途

1.3 Linux 正则表达式分类

1.4 正则表达式组成

(1)普通字符

(2)元字符:规则的核心载体

(3) 重复次数

(4)两类正则的核心区别与工具适配

二、文本处理器:grep/sed 的核心用法

   2.1 grep:条件查找工具

(1)常用选项(高频必记)

(2)经典场景示例

   2.2 sed:流编辑工具(补充适配正则的核心用法)

(1)基本格式

(2)必记选项

(3)核心操作指令(按功能分类)

(4)行地址指定方式(精准定位行)

三、关键避坑与效率技巧

四.总结

一. 正则表达式

1.1 定义

  • 正则表达式(Regular Expression, regex/regexp/RE)是一种用来描述字符串模式的规则。

  • 功能:检索、替换、过滤符合特定规则的字符串。

1.2 用途

  • 系统日志筛选(如定位“登录失败”“服务启动失败”)

  • 配置文件解析

  • 文本查找替换

  • 脚本编程中的条件匹配

1.3 Linux 正则表达式分类

  1. BRE (基础正则表达式)

    • 传统语法,功能有限

    • 量词 {} 需要转义 \{n,m\}

    • +, ?, () 需要转义

    • 常用工具:grepsed

  2. ERE (扩展正则表达式)

    • 功能更强大,语法简洁

    • +, ?, (), {}, | 等无需转义

    • 常用工具:egrep (grep -E)、awk

  • sed 默认是 BRE 模式,若要使用 ERE 功能,需加 -E 选项(如 sed -E 's/(a|b)/x/g' file),否则 + ? 等元字符需转义;
  • awk 本身支持 ERE 语法,无需额外加选项(如 awk '/wo+od/' file 可直接匹配多个 o),这是 awk 比 grep(默认 BRE)更灵活的点。

1.4 正则表达式组成

(1)普通字符

直接匹配自身,如字母(a-z/A-Z)、数字(0-9)、标点(,/.)等,无特殊语法含义。

(2)元字符:规则的核心载体
元字符作用描述BRE/ERE 用法差异示例
.匹配任意单个字符(不含 \r\n无差异a.c 匹配 abc/a1c/a#c
[]匹配括号内任意一个字符(字符集)无差异[0-9] 匹配任意数字,[a-zA-Z] 匹配字母
[^]匹配括号外任意一个字符(否定字符集)无差异[^0-9] 匹配非数字,[^w]oo 匹配非 w 开头的 oo
^① 正则开头:匹配行首;② [] 内开头:否定无差异^the 匹配行首为 the 的行,[^abc] 否定字母 a/b/c
$匹配行尾无差异end$ 匹配行尾为 end 的行,^$ 匹配空行
\转义符:去除元字符特殊含义无差异(BRE 需转义的元字符更多)a\.b 匹配 a.b(避免 . 匹配任意字符)
*匹配前一子表达式 0 次或多次无差异ab*c 匹配 ac/abc/abbc
+匹配前一子表达式 1 次或多次BRE 需转义 \+,ERE 直接用 +BRE:a\+c;ERE:a+c(均匹配 ac/aac
?匹配前一子表达式 0 次或 1 次BRE 需转义 \?,ERE 直接用 ?BRE:bes\?t;ERE:bes?t(均匹配 bet/best
()分组:将多个字符视为一个整体BRE 需转义 \(\),ERE 直接用 ()BRE:`t(a\e)st;ERE:\t(ae)st(均匹配 tast/test`)
{n}/{n,}/{n,m}精确匹配 n 次 / 至少 n 次 /n~m 次BRE 需转义 \{n\},ERE 直接用 {n}BRE:o\{2\};ERE:o{2}(均匹配 oo
``逻辑 “或”:匹配多个表达式之一BRE 需转义 |,ERE 直接用 ``BRE:a|b;ERE:`ab(均匹配 ab`)
(3) 重复次数
* 0 次或多次匹配前面子表达式0次或者多次 例:goo*d、go.*d
\+ 至少 1 次匹配其前面的字符出现最少1次,即:肯定有且 >=1 次
\{n\} 恰好 n 次匹配前面的子表达式n次,例:go\{2\}d、'[O-9]\{2\}'匹配两位数字
\{m,n\} m 到 n 次匹配前面的子表达式n到m次,例: go\{2,3\)d、'[0-9]\{2,3\}'匹配两位到三位数字
\{n,\} 至少 n 次匹配前面的子表达式不少于n次,例: go\{2,\}d、' [0-9]\{2,\}'匹配两位及两位以上数字

扩展:

egrep、awk使用{n}、{n, }、{n, m}匹配时“{}"前不用加"\”
egrep -E -n 'wo{2}d' test.txt   //-E 用于显示文件中符合条件的字符
egrep -E -n 'wo{2,3}d' test.txt
​
案列:
+   作用:重复一个或者一个以上的前一个字符
示例:执行“egrep -n 'wo+d' test.txt”命令,即可查询"wood" "woood" "woooooood"等字符串
​
?   作用:零个或者一个的前一个字符
示例:执行“egrep -n 'bes?t' test.txt”命令,即可查询“bet”“best”这两个字符串
​
|   作用:使用或者(or)的方式找出多个字符
示例:执行“egrep -n 'of|is|on' test.txt”命令即可查询"of"或者"if"或者"on"字符串
​
()  作用:查找“组”字符串
示例:“egrep -n 't(a|e)st' test.txt”。“tast”与“test”因为这两个单词的“t”与“st”是重复的,所以将“a”与“e”
列于“()”符号当中,并以“|”分隔,即可查询"tast"或者"test"字符串
​
()+ 作用:辨别多个重复的组
示例:“egrep -n 'A(xyz)+C' test.txt”。该命令是查询开头的"A"结尾是"C",中间有一个以上的"xyz"字符串的意思

(4)两类正则的核心区别与工具适配
维度基础正则(BRE)扩展正则(ERE)
语法特点功能有限,部分元字符需转义功能更全,元字符无需转义
关键元字符转义要求+/?/()/{} 需加 \(如 a\+/a\{2\}+/?/()/{}/`原生支持(如a+/a{2}`)
常用工具grep(默认)、sed(默认)grep -E/egrepsed -Eawk(默认)
工具适配补充sed 需加 -E 才能启用 ERE 功能awk 天生支持 ERE,无需额外选项

二、文本处理器:grep/sed 的核心用法

文本处理器是正则的 “执行工具”,grep 专注行级匹配过滤,sed 专注流编辑(替换 / 删除 / 插入),两者均需结合正则实现功能。

2.1 grep:条件查找工具

(1)常用选项(高频必记)
选项作用示例
-n显示匹配行的行号grep -n 'the' test.txt
-i忽略大小写匹配grep -i 'The' test.txt
-v反向匹配:输出不包含匹配内容的行grep -v 'ignore' test.txt
-c统计匹配行的数量grep -c 'root' /etc/passwd
-o只输出匹配的内容(而非整行)grep -o '[0-9]\+' test.txt(提取所有数字)
-E启用扩展正则(等价于 egrepgrep -E 'wo+od' test.txt(匹配 wood/woood
-r递归查找目录下所有文件grep -r -n 'ERROR' /var/log(递归查找日志中的错误行)
--color=auto高亮显示匹配内容grep --color=auto 'root' /etc/passwd
(2)经典场景示例
  • 提取 IP 地址(严谨版,避免无效 IP):grep -E -o '([0-9]{1,3}\.){3}[0-9]{1,3}' ifconfig.out
  • 过滤空行:grep -v '^$' test.txt
  • 匹配行首为数字的行:grep -n '^[0-9]' test.txt

   2.2 sed:流编辑工具(补充适配正则的核心用法)

Sed 的工作流程是「逐行处理、临时缓存、指令执行、输出清空」,核心是不直接修改原文件(默认),所有操作在内存缓冲区(模式空间)中进行,具体流程如下:

  1. 读取(Read):从输入流(文件 / 管道 / 标准输入)读取一行内容,存入「模式空间」(临时缓冲区);
  2. 执行(Execute):按指定指令(如替换、删除)处理模式空间中的行,未指定行地址则默认处理所有行;
  3. 显示(Print):将处理后的行输出到终端,随后清空模式空间;
  4. 循环:重复上述步骤,直至所有行处理完毕。

关键注意:默认情况下原文件不变,需用 -i 选项才能就地修改,或用重定向(>)保存输出。

(1)基本格式
sed [选项] '操作指令' 目标文件    # 单指令操作
sed [选项] -f 脚本文件 目标文件  # 多指令脚本(每行一条指令)
(2)必记选项
选项作用说明
-n取消默认输出(只输出被指令处理过的行,搭配 p 打印指令常用)
-i就地修改原文件(直接编辑文件,危险!建议加 .bak 备份:-i.bak
-i.bak就地修改并创建备份(备份文件名为「原文件名.bak」,如 config.bak
-e支持多指令连续执行(如 sed -e 's/a/A/' -e 's/b/B/' file
-r/-E启用扩展正则表达式(无需转义 +/?/() 等元字符,简化复杂匹配)
-f 脚本名从脚本文件中读取指令(适合多指令批量操作)
(3)核心操作指令(按功能分类)

Sed 操作指令格式:[行地址] 动作 [参数],行地址可选(默认所有行),常用动作如下:

动作功能描述示例
p打印(输出模式空间中的行,需搭配 -n 避免重复输出)sed -n '3p' demo(打印第 3 行)
d删除(删除模式空间中的行,不输出被删除行)sed '3,5d' demo(删除第 3-5 行)
s字符串替换(格式:s/旧内容/新内容/选项,核心选项 g 全局替换)sed 's/the/THE/g' demo(所有 the→THE)
i插入(在指定行上方插入内容,\n 可插入多行)sed '3iNewLine' demo(第 3 行上插新行)
a追加(在指定行下方插入内容,\n 可插入多行)sed '/the/aNewLine' demo(含 the 行下插)
c整行替换(用指定内容替换选定行,替换整行而非部分字符)sed '3cReplaceLine' demo(第 3 行替换为新内容)
y字符转换(按位置一对一映射,类似 tr,如 y/abc/ABC/ 表示 a→A、b→B、c→C)sed 'y/ap/AP/' demo(a→A、p→P)
H/G剪贴板操作(H 复制行到剪贴板,G 将剪贴板内容追加到当前行)sed '/the/{H;d};$G' demo(含 the 行移至末尾)
(4)行地址指定方式(精准定位行)

操作指令中可通过「行地址」指定处理范围,格式:[n1[,n2]] 动作,常见地址类型:

  • 数字:3(第 3 行)、3,5(第 3-5 行)、10,$(第 10 行至文件尾);
  • 正则:/the/(包含 the 的行)、/^PI/(以 PI 开头的行)、/[0-9]$/(以数字结尾的行);
  • 特殊:n;p(奇数行,n 读下一行)、n;p(偶数行)、1,5{p;n}(第 1-5 行的奇数行)。
  • 替换操作sed 's/旧内容/新内容/选项' 文件名,选项 g 表示全局替换(一行内所有匹配),-i 表示就地修改(建议加 .bak 备份:sed -i.bak 's/old/new/g' file
    • BRE 示例:sed 's/wo\{2\}d/WOOD/g' test.txt(将 wood 替换为 WOOD
    • ERE 示例:sed -E 's/wo{2,}d/WOOD/g' test.txt(将 wood/woood 等替换为 WOOD
  • 删除操作sed '/匹配规则/d' 文件名,如删除空行:sed '/^$/d' test.txt,删除行首为 # 的注释行:sed '/^#/d' test.txt

三、关键避坑与效率技巧

  1. 转义符陷阱:BRE 中 +/?/()/{} 必须转义,否则会被当作普通字符;建议优先用 ERE(grep -E/sed -E)减少转义负担。
  2. ^ 的歧义:务必区分 “正则开头的 ^(行首)” 和 “[] 内的 ^(否定)”,避免混淆匹配逻辑(如 ^[0-9] 是行首数字,[^0-9] 是非数字)。
  3. 工具适配优先级
    • 简单行过滤:用 grep(快且直观)
    • 文本替换 / 删除:用 sed(支持正则批量处理)
    • 字段级统计(如按逗号分割求和):用 awk(天生支持 ERE,适合字段处理)
  4. 安全操作:使用 sed -i 就地修改前,先不加 -i 预览效果(sed 's/old/new/g' file),或加备份(sed -i.bak ...),避免误删数据。

四.总结

正则表达式是 “规则”,文本处理器是 “执行工具”:

  • 先明确需求(匹配 / 提取 / 替换 / 统计),再选择正则类型(BRE 简单场景,ERE 复杂场景);
  • 工具选择遵循 “最小功能原则”:行过滤用 grep,编辑用 sed,字段统计用 awk
  • 记忆元字符时,优先掌握 ^/$(行锚点)、[]/[^](字符集)、*/+/?(重复次数),这三类是 80% 场景的核心。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/95261.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/95261.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Springboot 监控篇

在 Spring Boot 中实现 JVM 在线监控(包括线程曲线、内存使用、GC 情况等),最常用的方案是结合 Spring Boot Actuator Micrometer 监控可视化工具(如 Grafana、Prometheus)。以下是完整实现方案: 一、核…

Java 大视界 --Java 大数据在智能教育学习资源整合与知识图谱构建中的深度应用(406)

Java 大视界 --Java 大数据在智能教育学习资源整合与知识图谱构建中的深度应用(406)引言:正文:一、智能教育的两大核心痛点与 Java 大数据的适配性1.1 资源整合:42% 重复率背后的 “三大堵点”1.2 知识图谱&#xff1a…

2025年新版C语言 模电数电及51单片机Proteus嵌入式开发入门实战系统学习,一整套全齐了再也不用东拼西凑

最近有同学说想系统学习嵌入式,问我有没有系统学习的路线推荐。刚入门的同学可能不知道如何下手,这里一站式安排上。先说下学习的顺序,先学习C语言,接着学习模电数电(即模拟电路和数字电路)最后学习51单片机…

Android的USB通信 (AOA Android开放配件协议)

USB 主机和配件概览Android 通过 USB 配件和 USB 主机两种模式支持各种 USB 外围设备和 Android USB 配件(实现 Android 配件协议的硬件)。在 USB 配件模式下,外部 USB 硬件充当 USB 主机。配件示例可能包括机器人控制器、扩展坞、诊断和音乐…

人工智能视频画质增强和修复软件Topaz Video AI v7.1.1最新汉化,自带星光模型

软件介绍 这是一款专业的视频修复工具-topaz video ai,该版本是解压即可使用,自带汉化,免登陆无输出水印。 软件特点 不登录不注册解压即可使用无水印输出视频画质提升 软件使用 选择我们需要提升画质的视频即可 软件下载 夸克 其他网盘…

LeetCode 777.在LR字符串中交换相邻字符

在一个由 ‘L’ , ‘R’ 和 ‘X’ 三个字符组成的字符串(例如"RXXLRXRXL")中进行移动操作。一次移动操作指用一个 “LX” 替换一个 “XL”,或者用一个 “XR” 替换一个 “RX”。现给定起始字符串 start 和结束字符串 result&#x…

RK-Android15-WIFI白名单功能实现

实现WIFI白名单功能 。 三个模式: 1、默认模式:允许搜索所有的WIFI显示、搜索出来 ; 2、禁用模式:允许所有WIFI显示,能够搜索出来 ;3、白名单模式:允许指定WIFI名单显示,被搜索出来 文章目录 前言-需求 一、参考资料 二、核心修改文件和实现方式 1、修改文件 疑问思考 …

Maven + JUnit:Java单元测试的坚实组合

Maven JUnit:Java单元测试的坚实组合Maven JUnit:Java单元测试的坚实组合一、什么是软件测试?二、测试的维度:阶段与方法(一)测试的四大阶段(二)测试的三大方法三、main方法测试与…

FFMPEG 10BIT下 Intel b570 qsv 硬解AV1,H265视频编码测试

上10bitffmpeg 8.0 b570最新驱动 ,CPU 12100F 显卡 Intel b570 ffmpeg -hwaccel_output_format qsv -i "XXX.mkv" -vf "formatp010le" -c:v hevc_qsv -global_quality 19 -quality best -rc_mode ICQ -preset veryslow -g 120 -refs 5 -b…

SQL分类详解:掌握DQL、DML、DDL等数据库语言类型

如果你是一名数据库运维工程师,或者正在学习数据库技术,那么理解SQL的不同类型是非常重要的。让我们一起看看SQL到底有哪些种类,以及它们各自的作用。 1. 什么是SQL? SQL(Structured Query Language)是一种…

[特殊字符] 预告!我正在开发一款让自动化操作变得「像呼吸一样自然」的AI神器

各位技术爱好者和创作者朋友们,我要解决一个行业痛点!在上一个项目中(🔥 重磅预告!我要用AI开发一个自媒体神器,彻底解决创作者的7大痛点!),我本来雄心勃勃地打算直接用R…

加密软件哪个好用?加密软件-为数据共享提供安全保障

企业与合作伙伴协作时需共享大量数据,若缺乏保护,数据可能被非法获取,影响合作信任,甚至引发商业纠纷。加密软件可确保共享数据仅授权方可见,为数据共享提供安全保障,推动合作顺利开展。​1.固信软件固信加…

FPGA复位

1:能不复位尽量不要复位,减少逻辑扇出数:比如打拍信号。2:xilinx的FPGA推荐高复位,ATERAL的FPGA推荐低复位。3:尽量使用异步复位:大多数厂商目标库内的触发器都只有异步复位端口,采用同步复位需消耗较多逻辑资源。一&a…

Cursor 教我学 Python

文章目录1. 写在最前面2. Python 语法2.1 yield2.1.1 yield 和 return 的区别2.1.2 golang 中实现 yield 语法3. aiohttp 库3.1 原始写法3.2 修改写法3.2 耗时对比分析4. 碎碎念5. 参考资料1. 写在最前面 最近加了很多 Python Coding 的任务,虽然在 AI 加持下能够顺…

Ollama:本地大语言模型部署和使用详解

1.什么是Ollama? Ollama是一个开源的大语言模型管理工具,具有以下特点: 简单易用:提供简单的命令行接口本地部署:模型运行在本地,保护数据隐私跨平台支持:支持Windows、macOS、Linux丰富的模型…

云计算学习100天-第41天 -普罗米修斯2

目录 五、添加被监控端 1、在web1[192.168.88.100]上部署node exporter 2、在Prometheus服务器上添加监控节点 3、浏览器查看添加结果 六、Grafana的部署 概述 部署步骤 七、监控MySQL数据库 1、配置MySQL 2、配置mysql exporter 3、配置prometheus监控mysql 五、添…

集成电路学习:什么是SVM支持向量机

SVM:支持向量机 SVM,即支持向量机(Support Vector Machine),是一种常用的机器学习算法,特别适用于分类和回归问题。以下是对SVM的详细解析: 一、SVM的基本原理 SVM的基本思想是在特征空间中寻找一个最优的超平面,使得不同类别的样本能够被最大化地分开。这个最优…

盲盒抽谷机小程序开发:如何用3D技术重构沉浸式体验?

在盲盒经济中,“沉浸感”是提升用户停留时长与转化率的核心武器。某品牌通过3D扭蛋机旋转、卡牌翻转特效,使用户停留时长从15秒延长至45秒,转化率提升25%;另一品牌上线AR试戴功能后,单次抽谷时长延长至2分钟&#xff0…

集采与反腐双重压力下,医药销售的破局之道:从资源依赖到价值重构

在医药行业进入集采常态化与反腐纵深推进的新阶段,“资源匮乏”“拜访受阻” 成为萦绕在众多医药销售人员心头的难题。当传统的资金投入、学术活动等资源型打法逐渐失效,行业正面临一场从 “资源驱动” 到 “价值驱动” 的深刻变革。那些曾在市场中创造过…

Elasticsearch常用命令(未完)

网上针对es常用命令好多都是写的感觉非常复杂难以理解,所以我还是自己整理了一下相关的常用命令。 对es输入指令可以用很多种方法比如用es的谷歌浏览器插件,亦或者postman,我个人比较喜欢用postman比较简单直接 1.删除指定索引下的所有数据…