如何在TCL中通过exec执行sed命令?
问题描述
尝试使用TCL内置的exec过程执行以下sed命令:
sed -i 's/"VALUE.${name}">.*</"VALUE.${name}">${value}</' ${dir}/imp.xml
但执行时TCL报错:
sed: -e expression #1, char 1: unknown command: `''
尝试用大括号包裹整个命令进行转义,却导致字符串内的TCL变量(${name}、${value}、${dir})无法展开。当前使用的shell为csh,需要解决如何让TCL成功执行该sed命令。
解决方法
方式1:拆分exec参数(推荐)
TCL的exec支持直接传递命令的每个参数,无需依赖shell的引号规则,既能避免转义问题,又能正常展开TCL变量:
exec sed -i "s/"VALUE.$name">.*</"VALUE.$name">$value</" $dir/imp.xml
- 将sed的替换表达式用双引号包裹,TCL会自动展开其中的
$name、$value变量 - 把
sed、-i、替换表达式、文件路径作为独立参数传递,TCL会正确处理参数传递,不会被shell引号干扰
方式2:显式调用csh并转义
如果必须通过csh执行命令,需在外层用双引号包裹shell命令,确保TCL变量能展开,同时保留sed表达式的单引号避免被csh解析:
exec csh -c "sed -i 's/"VALUE.$name">.*</"VALUE.$name">$value</' $dir/imp.xml"
错误原因说明
原命令报错是因为TCL将单引号作为sed命令的一部分传递给sed,sed把开头的单引号识别为未知命令;而用大括号包裹整个命令时,TCL会将其作为单个参数,不会展开内部变量,导致变量无法替换。
内容的提问来源于stack exchange,提问作者Guilty
相关产品推荐
相关产品推荐

