Как заменить строку в файле, используя 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 ответа
Чтобы изменить строку в файле, который вы пишете, вы должны изменить его в памяти, прежде чем записывать его. (Или вы могли бы написать это, прочитать это снова, внести изменения и выписать измененную версию. Это полностью готовит еду из всего этого!) Учитывая, что это текстовый вывод из программы, которая первоначально предназначалась для человек, чтобы читать, это не будет так много. Максимум несколько мегабайт. Это означает, что мы можем легко накопить его в памяти и выполнить запись в конце.
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
соответствует чему-то.
Вы должны заключить свой шаблон в скобки:
regsub -all {debugshell} $output shell output4
Это довольно очевидно из соответствующей документации: