我试图将输出重定向到文本文件。它按预期工作。但是,我想用不同的字符串替换文本文件中的单词。我试过但它没有用。你能帮我解决这个问题。
set output [open /scripts/cisco/output4 "a+"]
for {set time 0} {$time < 3} {incr time} {
for {set times 0} {$times < 3} {incr times} {
log_user 0
exp_send "vmstat -n 2 5\r"
puts $output $expect_out(buffer)
expect "debugshell"
}
sleep 20
}
# i used regsub to replace the the string debugshell with shell
regsub -all debugshell $output shell output4
close $output
答案 0 :(得分:1)
为了更改您正在编写的文件中的字符串,您需要在写出之前在内存中更改它。 (或者你可以把它写出来,再读一遍,做出改变,然后把改变后的版本写出来。这完全可以做出一顿饭!)鉴于这是最初用于程序的文本输出一个人阅读,它不会那么多。最多几兆。这意味着我们可以轻松地将其累积在内存中并在最后进行写入。
set accumulate ""
for {set time 0} {$time < 3} {incr time} {
for {set times 0} {$times < 3} {incr times} {
log_user 0
exp_send "vmstat -n 2 5\r"
append accumulate $expect_out(buffer) "\n"
expect "debugshell"
}
sleep 20
}
regsub -all debugshell $accumulate shell accumulate_mapped
set output [open /scripts/cisco/output4 a+]
puts $output $accumulate_mapped
close $output
好的,既然我们正在谈论将变换应用到每一行(-all
让游戏离开),我们可以随时进行转换。在这种情况下,我们可能会这样做:
set output [open /scripts/cisco/output4 a+]
for {set time 0} {$time < 3} {incr time} {
for {set times 0} {$times < 3} {incr times} {
log_user 0
exp_send "vmstat -n 2 5\r"
regsub -all debugshell $expect_out(buffer) shell mapped
puts $output $mapped
expect "debugshell"
}
sleep 20
}
close $output
由于Expect捕获缓冲区也会捕获换行符,因此您可以考虑使用puts -nonewline
而不是puts
。它也可能完全,这个代码不会完全符合您的期望;一般来说,只有在$expect_out(buffer)
符合某事后才能真正看expect
。
答案 1 :(得分:0)
您需要将模式括在括号中:
regsub -all {debugshell} $output shell output4
从相应的文档中可以看出这一点: