使用SED命令替换含换行的多行配置内容失败如何解决
问题原因
你原来的命令无法生效有两个核心原因:
- sed默认是逐行读取处理文本的,你将多行的XML内容强行合并为单行写在匹配规则中,无法匹配到文件内跨多行的实际内容
- 硬编码的空格数量和文件内的实际缩进、换行格式无法完全对齐,匹配规则天然失效
正确命令
GNU Sed(Linux 环境适用)
sed -i ' /<key>disableMailRecentsSyncing<\/key>/{n;s/<true \/>/<false \/>/;} /<key>allowMailDrop<\/key>/{n;s/<false \/>/<true \/>/;} /<key>PreventMove<\/key>/{n;s/<true \/>/<false \/>/;} ' input.txt
BSD Sed(macOS/BSD 环境适用)
BSD 系 sed 的 -i 参数需要额外指定备份文件后缀,传空字符串 '' 表示不生成备份:
sed -i '' ' /<key>disableMailRecentsSyncing<\/key>/{n;s/<true \/>/<false \/>/;} /<key>allowMailDrop<\/key>/{n;s/<false \/>/<true \/>/;} /<key>PreventMove<\/key>/{n;s/<true \/>/<false \/>/;} ' input.txt
命令逻辑说明
规则采用逐key匹配的方式,容错率更高:匹配到对应key所在行后,自动跳转到下一行,对目标布尔值做替换,不受行之间的缩进、换行符差异影响。
内容的提问来源于stack exchange,提问作者Geraldo V Vieira
相关产品推荐
相关产品推荐

