使用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
相关产品推荐
相关产品推荐

