如何使用tcl / expect替换文件中的字符串

时间:2014-04-30 17:48:06

标签: regex tcl expect

我试图将输出重定向到文本文件。它按预期工作。但是,我想用不同的字符串替换文本文件中的单词。我试过但它没有用。你能帮我解决这个问题。

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

2 个答案:

答案 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

从相应的文档中可以看出这一点:

http://www.tcl.tk/man/tcl8.6/TclCmd/regsub.htm