如何在sed命令中让一个变量展开、另一个保持原样不展开?
解决sed中部分变量展开、部分保留原变量名的问题
方法1:拼接单双引号拆分sed脚本
Shell中,单引号包裹的内容不会被变量展开,双引号包裹的内容会触发变量展开。你可以把需要求值的$var1放在双引号段,需要保留原变量名的$var2放在单引号段,让Shell自动拼接成完整的sed命令:
var1="should be evaluated" var2="should not be evaluated" echo "$var1" | sed "s|$var1|"'$var2'|"
执行后输出为:$var2。
原理:sed脚本被拆成两部分——双引号内的"s|$var1|"会让Shell把$var1展开为实际值,单引号内的'$var2'会保持原字符串不变,最终组合成sed可识别的完整命令:s|should be evaluated|$var2|。
方法2:在双引号中转义$符号
如果想用完整的双引号包裹sed脚本,只需给不需要展开的变量前的$加反斜杠转义,让Shell把它当作普通字符处理:
var1="should be evaluated" var2="should not be evaluated" echo "$var1" | sed "s|$var1|\$var2|g"
这里的\$var2会被Shell解析为$var2字符串,不会展开var2的实际值,最终输出同样是$var2。
注意事项
如果var1中包含sed使用的分隔符(比如示例里的|),需要先对var1内的特殊字符转义,否则sed会报错。可以用以下命令生成转义后的变量:
escaped_var1=$(printf '%s' "$var1" | sed 's/[|]/\\&/g')
之后用$escaped_var1替换sed命令中的$var1即可。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

