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

张开发
2026/4/13 8:00:13 15 分钟阅读

分享文章

Shell编程之正则表达式与文本怎么用
一 正则表达式1 正则表达式的定义正则表达式Regular Expression简称regex或regexp是一种用于描述字符串匹配规则的文本模式。它由普通字符如字母、数字和元字符特殊符号组成通过特定的语法规则实现对字符串的搜索、匹配、替换或提取等操作。核心特点是一种迷你语言独立于编程语言但各语言实现可能有细微差异。通过模式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或编辑器中批量重构代码如重命名变量、调整格式。替换所有var为let。关键记忆点定义用模式描述字符串规则的文本工具。用途搜索、验证、替换、提取、分割文本。核心价值高效处理复杂的字符串操作减少手动编码。二 正则表达式类型1 基础正则表达式示例语法说明示例查找特定字符直接匹配指定的字符或字符串。hello匹配文本中的hello。中括号 []匹配括号内的任意一个字符字符集合。[aeiou]匹配任意一个元音字母。行首 ^ 和行尾 $^匹配行首$匹配行尾。^Hello匹配以Hello开头的行。任意字符 . 和重复字符 *.匹配任意单个字符除换行符*匹配前一个字符0 次或多次。h.*o匹配hello、halo等。连续字符范围 {}{n}匹配前一个字符n 次{n,m}匹配n 到 m 次。a{2,4}匹配aa、aaa、aaaa。以下是正则表达式的语法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.txtgrep -n ooo* test.txtgrep -n woo*d test.txt5查找连续字符范围”{}“在正则表达式中大括号 {}用于指定前一个字符或模式的重复次数是精确控制匹配数量的重要工具。语法示例# 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}/p2 元字符总结元字符含义.匹配任意单个字符除换行符\n。^匹配行首在[]内表示取反如[^a]匹配非a的字符。$匹配行尾。*匹配前一个字符0 次或多次贪婪匹配。匹配前一个字符1 次或多次需在扩展正则中使用。?匹配前一个字符0 次或 1 次也可用于非贪婪匹配如.*?。{n}匹配前一个字符恰好 n 次。{n,}匹配前一个字符至少 n 次。{n,m}匹配前一个字符n 到 m 次。[]匹配括号内的任意一个字符如[a-z]匹配任意小写字母。|或匹配需在扩展正则中使用如 catdog匹配cat或dog。()分组匹配可用于提取或应用量词如(ab)匹配ab、abab等。\转义字符用于匹配特殊字符本身如\.匹配.\*匹配*。3 扩展正则表达式扩展正则表达式在基础正则BRE上增加了更强大的功能通常需要加-E选项如grep -E或egrep。扩展功能说明示例匹配前一个字符1 次或多次BRE 中需用\{1,\}。gol匹配gol、gooool。?匹配前一个字符0 次或 1 次BRE 中需用\{0,1\}。colou?r匹配color或colour。|或匹配可组合多个模式。cat dog匹配cat或dog。()分组匹配支持捕获组和反向引用。(ab)匹配abab、ab等。\d,\w,\s预定义字符类部分工具支持\d数字\w单词字符\s空白符。\d{3}匹配123、456等。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 工具。关键区别语法简洁性ERE 的,?,|,()等无需转义BRE 需用\,\?,\|,\(\)。例如匹配color或colourBRE:colou\?rERE:colou?r功能扩展性ERE 支持非贪婪匹配.*?、或运算|、更灵活的量词BRE 功能受限。工具兼容性BRE 是传统 Unix 工具如grep、sed的默认模式ERE 需通过-E选项或egrep启用。现代语言如 Python、Perl默认使用 ERE 或更强大的正则引擎PCRE。如何选择使用 BRE兼容老旧脚本或必须使用sed/grep默认模式时。使用 ERE需要更简洁的语法和高级功能如|、时优先选择grep -E或awk。一句话总结ERE 是 BRE 的增强版语法更简洁、功能更强大但需注意工具兼容性。三 文本处理器1 sed工具sedStream Editor是一个强大的流式文本编辑器主要用于对文本进行查找、替换、删除、插入等操作支持正则表达式适合批量处理文本。sed的工作流程主要包括读取执行和显示三个过程读取将hello world读入模式空间。执行依次执行替换命令 →Hi world→Hi universe。显示输出最终结果Hi universe。sed语法sed [ 选项 ] “操作” 参数sed [ 选项 ] -f scriptfile 参数常见的sed命令选项主要包含以下几种选项作用-e (编辑脚本)指定要执行的编辑命令可多次使用连接多个命令-f (从文件读取脚本)表使用指定的脚本文件来处理输入的文本文件-h 或--help显示帮助-n (静默模式)表示仅显示处理后的结果-i (直接修改文件)直接编辑源文件谨慎使用建议先备份或测试-r (扩展正则表达式)启用扩展正则表达式-l (行缓冲输出)指定输出行的长度通常用于特殊设备或格式化1输出符合条件的文本p表示正常输出在正则表达式和文本处理工具如grep、sed、awk中p命令或print动作 用于显式输出符合条件的文本通常与条件匹配结合使用。

更多文章