我有以下TCL脚本,它执行Linux命令来格式化文件。
exec sed -r '2,$s/(.{55} )/\1\n\t/g' $formatfileName | sed 's/ $//' > $formatfileName
我收到一条错误,说无法读取“s”:执行时没有这样的变量 上面一行 - 它正在考虑将Linux命令中的$ sign作为变量。我试图放上花括号{},但那不起作用。
您能否告知如何使用上述命令而不出错?谢谢你的帮助。
答案 0 :(得分:2)
问题在于Tcl不使用单引号; Tcl中的等价物是花括号(除了那些正确嵌套)。此外,您需要写入与您所读取的文件不同的文件,或者在各个位打开文件进行读取和写入之间时会遇到一些尴尬的竞争条件,这会将文件擦除。 (你可以在之后重命名。)这样的事情应该有效。
exec sed -r {2,$s/(.{55} )/\1\n\t/g} $formatfileName | sed {s/ $//} > $formatfileName.new
file rename -force $formatfileName.new $formatfileName
那就是说,我很想在纯Tcl中做这件事(更长,但现在便携):
set f [open $formatfileName]
set lines [split [read $f] "\n"]
close $f
set f [open $formatfileName "w"]
foreach line $lines {
# First line is special
if {[incr LN] == 1} {
puts $f [string trimright $line]
continue
}
foreach l [split [regsub {.{55} } $line "&\n\t"] "\n"] {
puts $f [string trimright $l]
}
}
close $f
string trimright
s正在有效地执行第二个sed
正在做的事情,而中间的regsub
与第一个sed
相似,尽管我是也使用内部split
,以便可以一致地应用修剪。
这里没有棘手的file rename
;读取肯定在写入之前。