使用tcl执行Linux命令时出错

使用tcl执行Linux命令时出错,tcl,Tcl,我有下面的TCL脚本,它执行Linux命令来格式化文件 exec sed -r '2,$s/(.{55} )/\1\n\t/g' $formatfileName | sed 's/ $//' > $formatfileName exec sed-r'2,$s/(.{55})/\1\n\t/g'$formatfileName | sed's/$/'>$formatfileName 我得到一个错误,说不能读取“s”:执行时没有这样的变量 上面这一行——它将$sign-in-Linux命令视为一个变量

我有下面的TCL脚本,它执行Linux命令来格式化文件

exec sed -r '2,$s/(.{55} )/\1\n\t/g' $formatfileName | sed 's/ $//' > $formatfileName exec sed-r'2,$s/(.{55})/\1\n\t/g'$formatfileName | sed's/$/'>$formatfileName 我得到一个错误,说不能读取“s”:执行时没有这样的变量 上面这一行——它将$sign-in-Linux命令视为一个变量。我试着用大括号{},但没用


您能告诉我如何正确使用上述命令吗?感谢您的帮助。

问题是Tcl不使用单引号;Tcl中的等价物是花括号(除了那些正确嵌套的)。此外,您需要将文件写入与您读取的文件不同的文件,或者在不同的位打开文件进行读取和写入时,您会遇到一些尴尬的竞争条件,这将清除您的文件。(您可以在以后重命名。)类似的方法应该可以工作

exec sed -r {2,$s/(.{55} )/\1\n\t/g} $formatfileName | sed {s/ $//} > $formatfileName.new
file rename -force $formatfileName.new $formatfileName
也就是说,我很想在纯Tcl中实现这一点(更长,但现在是可移植的):

<代码>字符串TrimeLe>代码> s有效地执行了第二个<代码> SED所做的操作,中间的<代码> ReSub <代码>与第一个<代码> SED相似,虽然我使用了内部<代码>分割<代码>,这样修剪可以被一致地应用。


这里没有棘手的
文件重命名
;读肯定在写之前。

问题在于Tcl不使用单引号;Tcl中的等价物是花括号(除了那些正确嵌套的)。此外,您需要将文件写入与您读取的文件不同的文件,或者在不同的位打开文件进行读取和写入时,您会遇到一些尴尬的竞争条件,这将清除您的文件。(您可以在以后重命名。)类似的方法应该可以工作

exec sed -r {2,$s/(.{55} )/\1\n\t/g} $formatfileName | sed {s/ $//} > $formatfileName.new
file rename -force $formatfileName.new $formatfileName
也就是说,我很想在纯Tcl中实现这一点(更长,但现在是可移植的):

<代码>字符串TrimeLe>代码> s有效地执行了第二个<代码> SED所做的操作,中间的<代码> ReSub <代码>与第一个<代码> SED相似,虽然我使用了内部<代码>分割<代码>,这样修剪可以被一致地应用。


这里没有棘手的
文件重命名
;读取肯定在写入之前。

还可以通过多个模式在命令行上应用
sed
。你不需要烟斗。多谢多纳尔·费罗斯,带花括号的修改过的Linux部分很有魅力。感谢Tcl代码,它与Linux代码非常接近。我正在尝试进行一些更改以满足需要。感谢Brad Lanam,他不知道这一点。另外,
sed
可以传递多个模式以应用于命令行。你不需要烟斗。多谢多纳尔·费罗斯,带花括号的修改过的Linux部分很有魅力。感谢Tcl代码,它与Linux代码非常接近。我正在努力学习做出一些改变来满足需要。谢谢布拉德·拉南,我不知道。