You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:11:57