如何用Sed和正则替换数字,排除JBO-后数字并正确处理UUID?
Sed匹配替换数字但排除特定模式的实现方法
需求说明
需要替换文本中的数字,但以下两类数字不做替换:
- 符合
xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx格式的UUID字符串(由十六进制字符组成) JBO-前缀后的5位数字
输入示例:
echo "Execution error for request 40205911. JBO-12345: Reason: Expected meta model version with uuid '34a659f5-ad37-4fea-9593-95a1a818adbb', but retrieved meta model version with uuid '8a3de0d2-fcd9-4bfd-b4a7-070679dc0184'"
期望输出:
Execution error for request ########. JBO-12345: Reason: Expected meta model version with uuid '########-####-####-####-############', but retrieved meta model version with uuid '########-####-####-####-############'
问题分析
原脚本的核心问题:
- 未启用扩展正则(ERE),导致分组逻辑失效,后续全局替换会误改UUID内的数字、
JBO-后的数字 - 缺少针对
JBO-后数字的排除规则
正确的Sed实现
使用GNU Sed的扩展正则(-r参数)结合负向断言实现,脚本如下:
sed -r ' # 1. 替换UUID为对应掩码 s/([0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12})/########-####-####-####-############/g; # 2. 替换5-8位数字,但排除JBO-开头的5位 s/(^|[^J]BO-)[0-9]{5,8}/\1########/g; # 3. 替换单个数字,但排除JBO-后5位的组成部分 s/[0-9](?!([0-9]{4}|BO-[0-9]{4}))/#/g'
脚本解释
- UUID替换:精准匹配UUID格式,直接替换为掩码字符串,避免后续规则修改UUID内容
- 长数字替换:通过
(^|[^J]BO-)限定匹配范围,确保JBO-后的5位数字不被替换([^J]用于避免误匹配XJBO-这类字符串,无需的话可简化为(^|BO-)) - 单个数字替换:利用负向前瞻
(?!([0-9]{4}|BO-[0-9]{4})),确保当前数字不属于JBO-后5位的一部分,避免误改目标保留的数字
验证结果
将输入文本传入上述Sed命令,即可得到符合预期的输出。
内容的提问来源于stack exchange,提问作者Christian Bongiorno
相关产品推荐
相关产品推荐

