sed -i执行替换提示无效引用\1,如何实现方括号内字符串加引号?
sed 添加
-i 选项后报错的原因及解决办法 原因
你在带 -i 的写入命令里漏掉了 -r 选项!
- 当使用
-r时,sed 启用扩展正则表达式,括号()会被当作捕获组,\1能正确引用第一个捕获到的内容,所以测试读取文件时命令正常。 - 不带
-r时,sed 默认使用基础正则表达式,此时括号()只是普通字符,没有捕获功能,\1就成了无效引用,直接触发报错。
解决办法
有两种直接可行的方案:
方案1:保留扩展正则,补上 -r 选项
把 -r 加到带 -i 的命令中,和测试时的参数保持一致即可:
sed -i -r -e 's/\[([_a-z1-9]*)]/["\1"]/g' "test.php"
参数顺序不影响,也可以写成:
sed -r -i -e 's/\[([_a-z1-9]*)]/["\1"]/g' "test.php"
方案2:改用基础正则,转义捕获括号
如果不想用 -r 选项,就把捕获组的括号转义,让 sed 在基础正则模式下识别为捕获组:
sed -i -e 's/\[\([_a-z1-9]*\)]/["\1"]/g' "test.php"
这里把原表达式里的 ([_a-z1-9]*) 改成了 \([_a-z1-9]*\),符合基础正则的语法规则。
注意:如果是 macOS 系统的 sed,使用
-i时需要额外加一个空参数,否则会报错,命令需调整为:sed -i '' -r -e 's/\[([_a-z1-9]*)]/["\1"]/g' "test.php"
内容的提问来源于stack exchange,提问作者baaaaaziiiiingaaaaa
相关产品推荐
相关产品推荐

