You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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 '########-####-####-####-############'

问题分析

原脚本的核心问题:

  1. 未启用扩展正则(ERE),导致分组逻辑失效,后续全局替换会误改UUID内的数字、JBO-后的数字
  2. 缺少针对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'

脚本解释

  1. UUID替换:精准匹配UUID格式,直接替换为掩码字符串,避免后续规则修改UUID内容
  2. 长数字替换:通过(^|[^J]BO-)限定匹配范围,确保JBO-后的5位数字不被替换([^J]用于避免误匹配XJBO-这类字符串,无需的话可简化为(^|BO-))
  3. 单个数字替换:利用负向前瞻(?!([0-9]{4}|BO-[0-9]{4})),确保当前数字不属于JBO-后5位的一部分,避免误改目标保留的数字

验证结果

将输入文本传入上述Sed命令,即可得到符合预期的输出。

内容的提问来源于stack exchange,提问作者Christian Bongiorno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 13:13:08