如何使用正则表达式在bash/perl/python脚本中实现SSN掩码脱敏
SSN掩码脚本实现方案
核心规则说明:
- 严格匹配两类合法SSN格式:9位无分隔符纯数字、
3位数字-2位数字-4位数字横杠分隔格式 - 排除前后带额外数字的10位及以上非法数字串
- 两类格式分别对应掩码规则:无分隔符格式替换前5位为
XXXXX,横杠分隔格式替换前两段为XXX-XX
方案1:Perl一行命令(兼容性最优,正则写法最简洁)
直接在终端执行即可,适配绝大多数Unix/Linux/macOS环境:
perl -pe 's/\b(\d{3})-(\d{2})-(\d{4})\b/XXX-XX-$3/g; s/\b(\d{5})(\d{4})\b/XXXXX$2/g' testfile
方案2:GNU sed 一行命令(适用于常规Linux发行版)
需要加-E参数开启扩展正则支持,省略大量转义符:
sed -E 's/\b[0-9]{3}-[0-9]{2}-([0-9]{4})\b/XXX-XX-\1/g; s/\b[0-9]{5}([0-9]{4})\b/XXXXX\1/g' testfile
方案3:Python脚本(适合后续扩展复杂逻辑)
将以下内容保存为mask_ssn.py:
import re import sys with open(sys.argv[1], 'r', encoding='utf-8') as f: for line in f: # 优先处理带横杠的SSN格式 line = re.sub(r'\b\d{3}-\d{2}-(\d{4})\b', r'XXX-XX-\1', line) # 再处理无分隔符的SSN格式 line = re.sub(r'\b\d{5}(\d{4})\b', r'XXXXX\1', line) print(line, end='')
执行方式:
python3 mask_ssn.py testfile
效果验证
使用题目给出的测试用例执行后,输出结果完全符合要求:
XXXXX6789 needs to be matched. XXX-XX-6789 does, too. Mask this XXX-XX-6789 SSN please Don't miss XXXXX6789 either. XXXXX6789 should match. XXX-XX-6789 should also match. As should XXXXX6789 And XXX-XX-6789 But not 1234567890 1234567890 should also not match. And 1234567890 is right out.
之前替换失败的原因
- 原有正则将横杠设为可选匹配
-{0,1},替换时无法判断捕获到的SSN是带横杠还是纯数字格式,无法对应输出两种不同的掩码结果 - 部分版本sed默认使用基础正则模式,分组括号
()、次数量词{}未加反斜杠转义时,分组捕获逻辑不生效,无法提取后四位数字完成替换
内容的提问来源于stack exchange,提问作者R. Mack
相关产品推荐
相关产品推荐

