Perl单行正则替换不生效且返回bash语法错误问题求助
第一个Bash语法错误的原因
Bash 单引号包裹的字符串内部不支持转义单引号,你写的\'在单引号区间内会被Bash直接判定为结束当前单引号字符串,后续的字符直接暴露给Bash解析,自然会触发语法错误。
第二个替换结果异常的原因
当你改用双引号包裹Perl代码时,Bash会优先解析字符串内的$开头的变量,你正则里的捕获组引用$1会被Bash提前展开为空值,最终Perl实际接收到的正则逻辑是s/(bind_password = ')grafana'//g,所以匹配到的内容会被替换为空,只剩下捕获组里末尾的单引号,也就出现了你看到的结果。
正确的写法
方法1:单引号包裹的正确转义写法
在Bash单引号区间内要插入单引号,需要用'\''的格式(结束当前单引号、插入转义后的单引号、重新开启单引号区间):
perl -0pe 's/(bind_password = '\'')grafana'\''/$1'\''/g' file.txt
方法2:双引号包裹时转义$符号
避免Bash提前解析Perl的捕获组变量:
perl -0pe "s/(bind_password = ')grafana'/\$1'/g" file.txt
方法3:更简洁的无捕获组写法
你的需求不需要用到捕获组,直接全匹配替换即可,彻底避免转义冲突:
perl -0pe "s/bind_password = 'grafana'/bind_password = ''/g" file.txt
如果需要直接修改原文件,可以给perl加上-i参数。
内容的提问来源于stack exchange,提问作者Lou
相关产品推荐
相关产品推荐

