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

使用sed替换START-STOP间内容时,保留bash变量中的反斜杠

问题

现有文件内容如下:

Hello
START
{
toto=1
tata=2
}
STOP

需用Bash变量替换START与STOP之间的内容,但变量包含需保留的\字符,使用sed的c命令时,转义符被解析丢失,无法得到预期结果。

当前执行命令:

MY_VAR="it is 07\:00\:00"; sed -i "/START/,/STOP/c ${MY_VAR}" file 

实际输出结果:

Hello
it is 07:00:00

期望输出结果:

Hello
it is 07\:00\:00
解决方案

方法一:转义变量中的反斜杠

原命令中,sed会将变量内的\:解析为普通:,因此需要先将变量里的每个\转义为\\,确保sed处理后保留单个\:

MY_VAR="it is 07\:00\:00"
# 把变量中的\转义为\\
ESCAPED_VAR=$(printf '%s\n' "$MY_VAR" | sed 's/\\/\\\\/g')
# 执行替换
sed -i "/START/,/STOP/c ${ESCAPED_VAR}" file

方法二:使用awk替代sed(避免转义操作)

awk对变量的处理更直接,无需额外转义反斜杠,逻辑如下:

MY_VAR="it is 07\:00\:00"
awk -v var="$MY_VAR" '/START/{print var; flag=1; next} !flag; /STOP/{flag=0}' file > temp && mv temp file
  • 遇到START时,打印变量内容并标记跳过后续行
  • 未标记时正常输出原行
  • 遇到STOP时取消标记,恢复正常输出

内容的提问来源于stack exchange,提问作者Totoc1001

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 05:20:29