当前位置: 首页 > news >正文

Shell编程之正则表达式与文本怎么用

一 正则表达式

1 正则表达式的定义

正则表达式(Regular Expression,简称regexregexp)是一种用于描述字符串匹配规则的文本模式。它由普通字符(如字母、数字)和元字符(特殊符号)组成,通过特定的语法规则实现对字符串的搜索、匹配、替换或提取等操作。

核心特点

  • 是一种迷你语言,独立于编程语言(但各语言实现可能有细微差异)。

  • 通过模式(pattern)匹配文本,而非直接比较字符串。

2 正则表达式用途

正则表达式的主要应用场景包括:

用途说明示例
文本搜索快速查找符合特定规则的字符串(如邮箱、电话号码)。在日志中查找所有错误代码ERROR:\d+
数据验证验证用户输入格式(如密码强度、邮箱合法性)。检查密码是否包含大小写和数字^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$
文本替换批量替换符合规则的文本(如敏感词过滤、格式调整)。将日期格式从MM/DD/YYYY替换为YYYY-MM-DD
字符串提取从复杂文本中提取特定部分(如网页中的URL、文件中的关键词)。提取HTML中的链接href="(.*?)"
文本分割按规则拆分字符串(如CSV文件按分隔符分列)。按逗号或分号分割[,;]
日志分析解析结构化日志数据(如提取时间戳、IP地址)。匹配IP地址\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b
代码处理在IDE或编辑器中批量重构代码(如重命名变量、调整格式)。替换所有varlet

关键记忆点:

  • 定义:用模式描述字符串规则的文本工具。

  • 用途:搜索、验证、替换、提取、分割文本。

  • 核心价值:高效处理复杂的字符串操作,减少手动编码。

二 正则表达式类型

1 基础正则表达式示例

语法说明示例
查找特定字符直接匹配指定的字符或字符串。"hello"匹配文本中的hello
中括号 []匹配括号内的任意一个字符(字符集合)。[aeiou]匹配任意一个元音字母。
行首 ^ 和行尾 $^匹配行首,$匹配行尾。^Hello匹配以Hello开头的行。
任意字符 . 和重复字符 *.匹配任意单个字符(除换行符),*匹配前一个字符0 次或多次h.*o匹配hellohalo等。
连续字符范围 {}{n}匹配前一个字符n 次{n,m}匹配n 到 m 次a{2,4}匹配aaaaaaaaa

以下是正则表达式的语法:

(1)查找特定字符

语法:

grep -n [ 参数 ] 文本 //查找文本行号

grep -nv [ 参数 ] 文本 //查找文本行号相反的参数

语法示例:

(2)利用中括号” [] “来查找集合字符

范围表示法:

  • [a-z]:匹配任意小写字母。

  • [A-Z]:匹配任意大写字母。

  • [0-9]:匹配任意数字。

  • 组合范围[a-zA-Z0-9]匹配所有字母和数字。

特殊字符转义:

  • []内,大多数特殊字符(如.*)会失去特殊含义,无需转义。

  • 但以下字符需注意:

    • ^:仅在开头表示排除,其他位置作为普通字符。

    • -:表示范围时(如a-z),需放在开头或结尾避免歧义。

    • ]:需用\]转义或放在开头。

语法示例:

(3)查找行首字符” ^ “与行尾字符”$“

语法:

行首字符” ^ “

  • ^匹配一行的开头位置(在行首之前的位置)。

  • 通常用于确保模式出现在行首。

行尾字符”$“

  • $匹配一行的结尾位置(在行末换行符之前的位置)。

  • 通常用于确保模式出现在行尾。

语法示例:

grep '^hello' file.txt # 查找以 "hello" 开头的行

grep -v '^#' file.txt # 查找不以 `#` 开头的行(常用于过滤注释行)

grep 'world$' file.txt # 查找以 "world" 结尾的行

grep '^[A-Z]' file.txt # 查找以大写字母开头的行
grep '[0-9]$' file.txt # 查找以数字结尾的行

(4)查找任意一个字符” .“ 与重复字符”*“

在正则表达式中,.(点)和*(星号)是两个核心元字符,分别用于匹配任意单个字符重复前一个字符/模式

语法示例:

grep -n 'w..d' test.txt

grep -n 'ooo*' test.txt

grep -n 'woo*d' test.txt

(5)查找连续字符范围”{}“

在正则表达式中,大括号 {}用于指定前一个字符或模式的重复次数,是精确控制匹配数量的重要工具。

语法示例:

# grep (BRE):需转义
echo "aaa" | grep 'a\{2\}'

# grep (ERE):免转义
echo "aaa" | grep -E 'a{2}'

# sed (BRE):需转义
echo "aaa" | sed -n '/a\{2\}/p'

# sed (ERE):免转义
echo "aaa" | sed -E -n '/a{2}/p'

2 元字符总结

元字符含义
.匹配任意单个字符(除换行符\n)。
^匹配行首(在[]内表示取反,如[^a]匹配非a的字符)。
$匹配行尾。
*匹配前一个字符0 次或多次(贪婪匹配)。
+匹配前一个字符1 次或多次(需在扩展正则中使用)。
?匹配前一个字符0 次或 1 次(也可用于非贪婪匹配,如.*?)。
{n}匹配前一个字符恰好 n 次
{n,}匹配前一个字符至少 n 次
{n,m}匹配前一个字符n 到 m 次
[]匹配括号内的任意一个字符,如[a-z]匹配任意小写字母。
|

匹配(需在扩展正则中使用),如 `cat

dog匹配catdog`。

()分组匹配,可用于提取或应用量词,如(ab)+匹配ababab等。
\转义字符,用于匹配特殊字符本身,如\.匹配.\*匹配*

3 扩展正则表达式

扩展正则表达式在基础正则(BRE)上增加了更强大的功能,通常需要加-E选项(如grep -Eegrep)。

扩展功能说明示例
+匹配前一个字符1 次或多次(BRE 中需用\{1,\})。go+l匹配golgooool
?匹配前一个字符0 次或 1 次(BRE 中需用\{0,1\})。colou?r匹配colorcolour
|`匹配,可组合多个模式。`cat dog匹配catdog`。
()分组匹配,支持捕获组和反向引用。(ab)+匹配ababab等。
\d,\w,\s预定义字符类(部分工具支持):
\d数字,\w单词字符,\s空白符。
\d{3}匹配123456等。

4 扩展正则表达式和基础正则表达式的对比总结

特性基础正则表达式(BRE)扩展正则表达式(ERE)说明
量词*,\{n,m\}*,+,?,{n,m}ERE 支持更简洁的量词写法,BRE 需转义{}
或匹配 |不支持(需|转义)支持ERE 可直接使用|表示“或”关系,BRE 需 `\
分组 ()\( \)(需转义)()(直接使用)ERE 分组无需转义,BRE 需写成\(...\)
行首/行尾^,$^,$两者相同。
字符集 []支持支持两者相同。
非贪婪匹配不支持(默认贪婪)支持*?,+?ERE 可用?实现非贪婪匹配,BRE 无此功能。
预定义字符类部分支持(如\w依赖工具)更广泛支持(如\d,\sERE 在某些工具(如grep -P)支持 Perl 风格正则。
适用工具grep,sed(默认)grep -E,egrep,awk,Perl,PythonERE 更现代,BRE 主要用于传统 Unix 工具。

关键区别:

  1. 语法简洁性

    • ERE 的+,?,|,()无需转义,BRE 需用\+,\?,\|,\(\)

    • 例如匹配colorcolour

      • BRE:colou\?r

      • ERE:colou?r

  2. 功能扩展性

    • ERE 支持非贪婪匹配.*?)、或运算|)、更灵活的量词,BRE 功能受限。

  3. 工具兼容性

    • BRE 是传统 Unix 工具(如grepsed)的默认模式,ERE 需通过-E选项或egrep启用。

    • 现代语言(如 Python、Perl)默认使用 ERE 或更强大的正则引擎(PCRE)。

如何选择?

  • 使用 BRE:兼容老旧脚本或必须使用sed/grep默认模式时。

  • 使用 ERE:需要更简洁的语法和高级功能(如|+)时,优先选择grep -Eawk

一句话总结:ERE 是 BRE 的增强版,语法更简洁、功能更强大,但需注意工具兼容性。

三 文本处理器

1 sed工具

sed(Stream Editor)是一个强大的流式文本编辑器,主要用于对文本进行查找、替换、删除、插入等操作,支持正则表达式,适合批量处理文本。

sed的工作流程主要包括读取,执行和显示三个过程:

  1. 读取:将"hello world"读入模式空间。

  2. 执行:依次执行替换命令 →"Hi world""Hi universe"

  3. 显示:输出最终结果"Hi universe"

sed语法:

sed [ 选项 ] “操作” 参数

sed [ 选项 ] -f scriptfile 参数

常见的sed命令选项主要包含以下几种:

选项作用
-e (编辑脚本)指定要执行的编辑命令(可多次使用,连接多个命令)
-f (从文件读取脚本)表使用指定的脚本文件来处理输入的文本文件
-h 或--help显示帮助
-n (静默模式)表示仅显示处理后的结果
-i (直接修改文件)直接编辑源文件(谨慎使用,建议先备份或测试)
-r (扩展正则表达式)启用扩展正则表达式
-l (行缓冲输出)指定输出行的长度(通常用于特殊设备或格式化)

(1)输出符合条件的文本(p表示正常输出)

在正则表达式和文本处理工具(如grepsedawk)中,p命令print动作 用于显式输出符合条件的文本,通常与条件匹配结合使用。


http://www.jsqmd.com/news/633106/

相关文章:

  • Qwen3.5-4B-Claude-4.6-Opus-Reasoning-Distilled-GGUF在Ubuntu20.04上的部署教程
  • 深入剖析Redis分布式锁:从原子性加锁到Lua脚本安全释放
  • FlowState Lab 生成极限测试:边界条件与异常输入下的输出分析
  • OpenClaw人人养虾:openclaw dashboard
  • SmolVLA在AIGC工作流中的应用:集成ComfyUI实现可视化创作
  • 西安市长安区鑫宝通建筑设备租赁部:西安围挡租赁 围挡出售公司电话 - LYL仔仔
  • Omni-Vision Sanctuary模型Fine-tuning实战:使用自定义数据集的步骤详解
  • bulk-downloader-for-reddit异常处理机制:网络错误与重试策略分析
  • 工控实战|C#上位机+YOLO视觉 一站式落地三大工业场景:缺陷检测_物料计数_定位引导
  • 开箱即用!Stable Diffusion v1.5 Archive 镜像部署,无需配置复杂环境
  • MimicMotion API详解:predict.py接口的完整使用手册
  • Mermaid Live Editor:5分钟掌握实时图表编辑的终极免费工具
  • 通义千问2.5-7B新手入门:vLLM+WebUI镜像,手把手教你搭建智能问答系统
  • ComfyUI插件生态系统的自动化管理架构实战
  • CCPD车牌识别技术详解:从数据集构建到模型训练全流程
  • MultiMap嵌入式非线性插值库:分段线性映射实战指南
  • CLIP-GmP-ViT-L-14赋能智能内容审核:基于JavaScript的Web应用开发
  • 3个实战技巧:让魔兽争霸3在现代系统完美运行
  • Java的java.util.HexFormat十六进制格式化与二进制数据的安全表示
  • 北京弘语航叉车吊车租赁:北京叉车 吊车出租公司电话 - LYL仔仔
  • 告别复杂配置!Wan2.1视频生成WebUI一键部署与快速上手体验
  • GME-Qwen2-VL-2B-Instruct在法律文书中的应用:证据图与案情描述匹配
  • ncmdumpGUI:免费快速解密网易云音乐NCM文件的终极解决方案
  • Vue Styleguidist完整配置手册:从基础到高级设置详解
  • electron-vue-cloud-music数据持久化:Nedb数据库在音乐应用中的应用
  • cv_resnet101_face-detection_cvpr22papermogface 系统级整合:在操作系统课程设计中实现人脸登录模块
  • Z-Image-Turbo-辉夜巫女快速部署:Docker镜像免编译、免依赖、开箱即用体验
  • MIR与主流JIT编译器对比:性能、体积与编译速度的终极较量
  • TensorFlow-v2.9深度学习镜像5分钟快速部署:Windows/Linux双系统保姆级教程
  • 华为OD机试 - Alice的安全旅行 - 广度优先搜索BFS(Python/JS/C/C++ 新系统 200分)