如何优化shell脚本中sed实现信用卡号前12位掩码的逻辑
优化方案
你的原有实现存在两个可优化的点:
- 逐行循环调用
sed,每行都会创建一个新的sed进程,处理大文件时性能损耗极高 - 正则规则拆分过散,可读性和维护性都较差
方案1:统一输出为空格分隔的掩码格式(和你原有实现输出效果完全一致)
直接用sed处理整个文件即可,无需额外循环:
sed -E 's/[^0-9]//g; s/^[0-9]{12}/**** **** **** /' cards.txt > cards-masked.txt
逻辑说明
- 第一步
s/[^0-9]//g:先把所有非数字字符全部删除,整行转换为16位纯数字卡号 - 第二步
s/^[0-9]{12}/**** **** **** /:把开头的12位数字直接替换为空格分隔的星号,自动保留最后4位原始数字
方案2:保留原始分隔符格式
如果你需要保留输入的分隔符(比如原分隔符是_输出也保留_,原分隔符是-输出也保留-),可以用以下更灵活的写法:
sed -E 's/^(([^0-9]*[0-9]){12})/\1\n/;h;s/[^\n]*\n//;x;s/\n.*//;s/[0-9]/*/g;G;s/\n//' cards.txt > cards-masked.txt
逻辑说明
- 第一步在第12位数字的末尾插入换行符作为分割标记
- 通过hold空间分别处理标记前后的内容:标记前的所有数字替换为星号,标记后的内容保留原始值
- 最后合并两部分内容删除标记,得到保留原分隔符的掩码结果
兼容说明
如果是旧版本Unix系统不支持-E参数,替换为-r即可,二者功能一致都是启用扩展正则表达式。
内容的提问来源于stack exchange,提问作者isvalx
相关产品推荐
相关产品推荐

