使用 grep 和 sed 来全局替换文件
程序员文章站
2023-12-26 14:01:57
...
今天有用户反映,199开头的手机号,不能注册,想了下,项目中的 'mobile' 正则确实限制了号段。
手机号正则,都不知道该怎么判断,新的号段不断出现,实在不行就是1\d{10}算了
正题,替换所有的手机号正则:
我的手机号正则,也很是简单
1[34578][0-9]{9} - 手机号
(0[0-9]{2,3}-)?[2-9][0-9]{6,7}(-[0-9]{1,4})? - 座机号
grep -l "34578]" -R * | xargs sed -i "s/34578\]/345789]/g"
上面一条命令直接搞定。
分析:
使用 sed 全局替换,比较危险,我们可以先使用 grep 来搜索替换的行,是否准确
grep "34578]" -R *
grep -l // 表示匹配到的文件
sed -i // 是直接进行文件替换,否则只是将替换后的字符串输出,并不会替换文件内容
过程中问题:
在 mac 上进行 sed -i "s/34578\]/345789]/g" 一直报错。后搜索到答案,Mac 或 BSD 系统的 sed,强制要求 -i 选项必须加参数。
sed -i // 是为了安全考虑,指定一个后缀,用于对替换文件被替换之前,进行一个备份。不同的系统,我们可以使用 man sed 来查看文档。
// 必须指定后缀,但可以指定一个 "" 空后缀,表示不备份文件
mac 的 -i 选项说明:
-i extension
Edit files in-place, saving backups with the specified extension. If a zero-length extension is given, no backup will be saved. It is not recommended to give a zero-length extension when in-place editing files, as you risk corruption or partial content in situations where disk space is exhausted, etc.
// 不指定后缀,就是不备份文件
linux 的 -i 选项说明:
-i[SUFFIX], --in-place[=SUFFIX]
edit files in place (makes backup if SUFFIX supplied)