如何用sed在指定字符串</fontconfig>前插入多行内容?
解决用sed在
</fontconfig>前插入内容的问题 遇到包含<、>和/的字符串匹配时,核心问题是sed默认用/作为分隔符,直接写会导致语法错误。我们可以通过两种思路解决:换分隔符或者转义特殊字符,下面给你具体的实现方案:
方法1:换分隔符(推荐,更简洁)
sed允许你自定义地址匹配的分隔符,只要用一个不在目标字符串里的字符就行(比如@、#、|)。这样就不用转义</fontconfig>里的/了。
比如你要插入两行内容:<dir>/usr/share/fonts</dir>和<dir>~/.fonts</dir>,命令如下:
# GNU sed(Linux) sed '@</fontconfig>@i\ <dir>/usr/share/fonts</dir>\ <dir>~/.fonts</dir>' your_fontconfig.conf # 如果要直接修改原文件,加-i参数 sed -i '@</fontconfig>@i\ <dir>/usr/share/fonts</dir>\ <dir>~/.fonts</dir>' your_fontconfig.conf # BSD sed(macOS),需要给-i加空参数 sed -i '' '@</fontconfig>@i\ <dir>/usr/share/fonts</dir>\ <dir>~/.fonts</dir>' your_fontconfig.conf
这里的i\表示在匹配到的行之前插入内容,每一行插入的内容需要用\换行分隔(shell环境下这样写才能识别多行)。
方法2:转义特殊字符
如果不想换分隔符,就把目标字符串里的/转义成\/,其他字符(<、>)不需要转义,因为sed的地址匹配里它们不是特殊字符:
sed '/<\/fontconfig>/i\ <dir>/usr/share/fonts</dir>\ <dir>~/.fonts</dir>' your_fontconfig.conf
方法3:用替换命令实现插入
另一种思路是把</fontconfig>替换成「你要插入的内容 + 原标签」,用&代表匹配到的原字符串:
sed 's@</fontconfig>@<dir>/usr/share/fonts</dir>\ <dir>~/.fonts</dir>\ &@' your_fontconfig.conf
这种写法和方法1的效果完全一样,适合喜欢用替换逻辑的场景。
注意事项
- 如果插入的内容里也包含你选的分隔符(比如你用
@但内容里有@),就换另一个分隔符,或者转义那个分隔符。 - 不同系统的sed语法略有差异(比如macOS的BSD sed),如果遇到换行不生效的问题,可以用bash的ANSI-C引用写法:
sed -e $'@</fontconfig>@i\\\n<dir>/usr/share/fonts</dir>\\\n<dir>~/.fonts</dir>' your_fontconfig.conf
内容的提问来源于stack exchange,提问作者user41063
相关产品推荐
相关产品推荐

