编写Shell脚本:无指定TICKET标识时插入随机5位数字标识
为文本添加随机工单标识的Shell脚本实现
需求说明
处理单行文本:
- 若文本已包含格式为
[TICKET: XXXXX](XXXXX为任意5位数字)的标识,直接输出原内容; - 若未包含该标识,插入格式为
[TICKET: XXXXX]的内容(XXXXX为随机5位数字),示例如下:- 原内容:
Subject: [TICKET: 12345] test subject→ 输出:Subject: [TICKET: 12345] test subject - 原内容:
Subject: test subject→ 输出:Subject: [TICKET: 67890] test subject
- 原内容:
解决方案:使用awk实现
awk适合处理这类文本匹配与修改的场景,以下是具体实现:
基础脚本
awk '/\[TICKET: [0-9]{5}\]/ {print; next} {rand_ticket = sprintf("[TICKET: %05d]", int(rand()*100000)); sub(/Subject: /, "&"rand_ticket" "); print}' input.txt
代码解析
- 匹配检查:用正则
\[TICKET: [0-9]{5}\]检测行中是否存在合规工单标识,匹配则直接打印该行并跳过后续逻辑; - 生成随机标识:通过
rand()生成0-1的随机数,乘以100000取整得到0-99999的数字,再用sprintf格式化为带前导0的5位数字; - 插入标识:使用
sub函数在Subject:后插入生成的工单标识,确保格式与示例一致。
带随机种子的版本
为避免每次运行生成相同的随机数,可加入srand()以当前时间为种子:
awk 'BEGIN{srand()} /\[TICKET: [0-9]{5}\]/ {print; next} {rand_ticket = sprintf("[TICKET: %05d]", int(rand()*100000)); sub(/Subject: /, "&"rand_ticket" "); print}' input.txt
全局插入的变种
如果需要对所有无标识的行在开头插入工单标识,修改sub行为直接拼接:
awk 'BEGIN{srand()} /\[TICKET: [0-9]{5}\]/ {print; next} {rand_ticket = sprintf("[TICKET: %05d]", int(rand()*100000)); print rand_ticket" "$0}' input.txt
内容的提问来源于stack exchange,提问作者Dadroid
相关产品推荐
相关产品推荐

