Mac环境下Bash中使用sed替换行内容失败的问题排查
问题描述
我有一行内容如下:
"startTime": "2022:12:03T10:00:00Z",
我希望将该行中的日期替换为变量dtime对应的日期,已知文件路径,执行了如下命令:
sed -i 's/"startTime":"*/"startTime":"'$dtime'",/' $filePath
但该命令无法生效。我正在使用Mac系统,想询问是否存在与Mac相关的特性导致此问题。
解决办法
1. 适配Mac版sed的-i参数特性
Mac自带的是BSD版本sed,和Linux的GNU sed差异明显:它的-i参数必须指定备份文件的后缀,哪怕不需要保留备份,也要加一个空后缀(-i '')。如果省略这个参数,命令会直接失效。
2. 修正正则表达式匹配逻辑
原命令里的"startTime":"*匹配逻辑错误,*需要匹配前置字符的重复次数,这里应该用[^"]*来精准匹配双引号之间的日期内容,避免匹配到无关字符。
3. 规范变量引用方式
变量$dtime最好用双引号包裹,防止变量值包含空格、特殊字符时出现解析异常。
最终可执行的正确命令:
sed -i '' 's/"startTime":"[^"]*"/"startTime":"'"$dtime"'",/' "$filePath"
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

