Mac下如何修复bash中sed对数字的匹配失效问题?
解决Mac系统下用sed替换JSON中mtime字段值为0的问题
正确命令示例
方法1:使用扩展正则表达式(推荐)
Mac自带的sed默认采用基础正则表达式(BRE),添加-E选项可启用扩展正则表达式(ERE),此时+能直接表示"匹配一个或多个连续字符":
echo "\"mtime\": 1234," | sed -E 's/"mtime": *[0-9]+/"mtime": 0/g'
输出结果:
"mtime": 0,
方法2:使用基础正则表达式语法
如果不想启用扩展正则,可在BRE标准语法中用\{1,\}替代+,实现"匹配一个或多个连续数字":
echo "\"mtime\": 1234," | sed 's/"mtime": *[0-9]\{1,\}/"mtime": 0/g'
为什么之前的尝试失败?
Mac的sed是BSD版本,和Linux上的GNU sed正则语法存在差异:
- 直接写
[0-9]+时,BRE会把+当作普通字符处理,无法匹配连续数字 - 转义成
[0-9]\+在部分BSD sed版本中不被支持,而\{1,\}是BRE中标准的"一个或多个"写法 - 第一个命令仅匹配单个数字,因此只替换了开头的
1为0,剩余数字未被处理
内容的提问来源于stack exchange,提问作者Daniel Stephens
相关产品推荐
相关产品推荐

