如何使用Sed与扩展正则表达式修改文本文件手机号并打印到终端
Sed处理手机号格式化方案
原命令问题
你之前执行的sed 'S/04/()/_1234_5678'无法生效,核心问题有3个:
- sed替换指令以小写
s开头,大写S不是标准替换语法 - 替换指令的标准结构是
s/匹配规则/替换结果/,你写的规则没有做通用匹配,只能硬替换固定字符串,无法适配所有10位手机号 - 未启用扩展正则模式,无法直接通过括号做分组捕获
前置说明
你的phone.txt内所有号码均为固定10位、纯数字格式,用正则分组捕获即可快速实现两种格式化需求,执行命令时加-E参数启用扩展正则(部分老版本GNU sed可替换为-r参数)。
格式1实现:(xx)_xxxx_xxxx 样式
规则要求:前两位数字放入括号,第二位、第六位数字后加下划线,示例效果(04)_1234_5678
执行命令
sed -E 's/^([0-9]{2})([0-9]{4})([0-9]{4})$/(\1)_\2_\3/' phone.txt
实现逻辑
将整行10位数字拆为3个捕获组:
- 第1-2位:前2位数字
- 第3-6位:中间4位数字
- 第7-10位:最后4位数字
替换时按格式拼接分组内容即可。
对应输出
(04)_1234_5678 (04)_9266_9266 (04)_5829_1324 (04)_2719_3732 (04)_2938_1912 (04)_3920_1291
格式2实现:+61 xxx-xxx-xxx 样式
规则要求:首位的0替换为+61 (后面带半角空格),后续数字每三位间加短横线,示例效果+61 412-435-678
执行命令
sed -E 's/^0([0-9]{3})([0-9]{3})([0-9]{3})$/\+61 \1-\2-\3/' phone.txt
实现逻辑
匹配开头的0,将剩下的9位数字拆为3个各3位的捕获组,替换时把开头的0替换为+61 ,三个分组间用短横线连接。
对应输出
+61 412-345-678 +61 492-669-266 +61 458-291-324 +61 427-193-732 +61 429-381-912 +61 439-201-291
注:命令里加了
^和$锚定行首行尾,避免文件里如果存在非10位的杂项行被误替换。
内容的提问来源于stack exchange,提问作者Harry Issac
相关产品推荐
相关产品推荐

