Ваш код делает именно то, что вы хотите, вы просто читаете строковый повтор своего вывода и неправильно понимаете его:
% set l { A B C D }
A B C D
% foreach elem $l { puts $elem }
A
B
C
D
% set j [lreplace $l 1 2 \[ \]]
A {[} \] D
% foreach elem $j { puts $elem }
A
[
]
D
% join $j
A [ ] D
Когда вы читаете строковый повтор, вы видите, что он экранирует[и].Как вы можете видеть из вывода foreach, фактические значения - это то, что вы запрашиваете.Вы можете использовать join
, чтобы получить интересующую вас строку, если вам нужна только строка с соответствующими символами.