Bash脚本sed命令替换文件指定键值不生效问题
问题定位
当前sed命令失效是正则写法和逻辑错误导致,具体问题点:
[occupation=]属于正则字符集语法,仅匹配方括号内的任意单个字符,无法匹配完整的occupation=固定字符串- 未定义
occupation=后待替换的旧值匹配规则,+元字符在sed默认基础正则模式下无法直接生效,且替换位的引号拼接逻辑会破坏原文件的键值对格式 - 单双引号交叉拼接的写法鲁棒性差,变量含特殊字符时极易出现匹配异常
正确实现
修正后的file2.sh内容如下:
#!/bin/bash newOccupation="Teacher" # 兼容Linux/macOS双平台sed实现,替换时保留原有键名和引号结构 sed -i.bak -E "s/(occupation=\")[^\"]*/\1${newOccupation}/g" file1.txt # 不需要sed自动生成的备份文件可执行删除 rm -f file1.txt.bak
命令逻辑说明:
- 用双引号包裹整个sed匹配替换表达式,无需复杂的引号拼接即可正常解析Shell变量
(occupation=\")作为捕获组匹配固定前缀occupation=",替换时通过\1引用,保留原有格式[^\"]*匹配前缀后所有非双引号的内容(即原有的职业值),直接替换为新变量值即可-E参数开启扩展正则模式,减少不必要的转义符,跨平台兼容性更好
脚本执行后file1.txt的预期内容:
name="Bobby" age="23" occupation="Teacher" favoriteColor="Red"
提示:如果
newOccupation变量包含/、&、\这类sed特殊字符,需要先对变量做转义处理再传入sed命令,纯文本场景下上述命令可直接使用。
内容的提问来源于stack exchange,提问作者steveo
相关产品推荐
相关产品推荐

