使用sed替换字符串间文本且保留注释的技术问询
解决sed替换MySQL主机地址并保留注释的问题
嘿,我来帮你搞定这个sed替换的小麻烦~你之前的命令没生效,问题出在正则表达式的匹配逻辑上,咱们一步步来解决:
原命令的问题分析
你写的正则\('ENGINE': ').*\([^']*\)里,.*是贪婪匹配,它会从'ENGINE': '之后一直匹配到行内最后一个满足[^']*的位置——也就是把, # MySQL host里的内容也卷进来了,导致整个正则无法精准匹配到你要替换的a.mysql.com部分,自然替换就没生效。
正确的解决方案
这里有两种靠谱的写法,根据你的需求选就行:
方法1:通用匹配(不管原域名是什么都能替换)
这个写法会精准捕获'ENGINE': '后面的域名(直到下一个单引号),同时完整保留后面的注释内容:
# GNU sed(Linux系统) sed -i -e "s/\('ENGINE': '\)[^']*\('.*\)/\1new.mysql.com\2/" file.py # BSD sed(macOS系统),注意-i后面要加空参数 sed -i '' -e "s/\('ENGINE': '\)[^']*\('.*\)/\1new.mysql.com\2/" file.py
正则逻辑解释:
\('ENGINE': '\):捕获第一个分组,对应行里的'ENGINE': '部分[^']*:匹配所有非单引号的字符(也就是你要替换的原域名a.mysql.com)\('.*\):捕获第二个分组,从下一个单引号开始到行尾的所有内容(包括, # MySQL host注释)- 替换时用
\1拼接新域名,再加上\2,完美保留注释
方法2:精准匹配原域名(更直观)
如果你确定该行里只有这一处a.mysql.com,可以直接写死匹配内容,替换起来更简单:
# GNU sed sed -i -e "s/'ENGINE': 'a.mysql.com'/'ENGINE': 'new.mysql.com'/g" file.py # BSD sed sed -i '' -e "s/'ENGINE': 'a.mysql.com'/'ENGINE': 'new.mysql.com'/g" file.py
测试小技巧
执行替换前,可以先去掉-i参数运行命令,预览替换后的结果,确认没问题再执行实际修改:
sed -e "s/\('ENGINE': '\)[^']*\('.*\)/\1new.mysql.com\2/" file.py
内容的提问来源于stack exchange,提问作者Anon
相关产品推荐
相关产品推荐

