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

Regex 如何使用tcl/expect替换文件中的字符串,regex,tcl,expect,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 "vmst

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

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
设置输出[open/scripts/cisco/output4“a+”]
对于{set time 0}{$time<3}{incr time}{
对于{set times 0}{$times<3}{incr times}{
日志用户0
exp\u发送“vmstat-n 2 5\r”
将$output$expect\u输出(缓冲区)
期待“debugshell”
}
睡20
}
#我使用regsub将字符串debugshell替换为shell
regsub-所有debugshell$output shell output4
关闭$output

您需要将图案括在括号中:

regsub -all {debugshell} $output shell output4
这在相应的文档中非常明显:


要更改正在写入的文件中的字符串,需要在写入之前在内存中对其进行更改。(或者你可以把它写出来,再读一遍,修改一下,再把修改过的版本写出来。这简直是大吃一惊!)考虑到这是一个原本供人阅读的程序的文本输出,所以不会有那么多。最多几兆字节。这意味着我们可以很容易地将其积累在内存中,并在最后进行写入

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

因为预期捕获缓冲区也会捕获新行,所以您可以考虑使用<代码> -Posi-NoeWrLe>代码>代替Pux。这段代码也很可能不能完全实现您的期望;一般来说,您只需要在

expect
匹配某个内容后立即查看
$expect\u out(缓冲区)

但是,当
$output
包含频道名称时,这不适用于更改文件内容……感谢您的回复。如果要将输出文件中的另一个字符串替换为空字符串(以及debugshell到shell),该如何操作?除了所需的输出之外,输出文件还包含三个字符串1)debugshell 2)#3)vmstat-n 2 5脚本将debugshell替换为\n。我尝试删除了#和vmstat-n2-5,但没有成功,但是我无法从输出文件中替换#和vmstat-n2-5。你能帮我解决这个问题吗
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