Ваша проблема в том, что вам нужно прописать строку с ограниченным количеством подстановок, но эта строка содержит символы $
, "
и \
. Эти специальные символы означают, что использование обычного слова в двойных кавычках в Tcl очень неудобно;Вы можете использовать множество обратных косых черт для цитирования метасимволов TCL, но это ужасно, когда большая часть строки написана на другом языке (shell / sed в вашем случае). Вот лучший вариант с string map
и словом в кавычках (без замен):
set str {sed -i "s/XXXTLEXXX/$1/" /%FILE%}
puts $f [string map [list "%FILE%" $file] $str]
Обратите внимание, что вы можете сделать несколько замен в одной string map
, и что она делает каждуюзамена везде, где это возможно. Вы также можете использовать многострочный литерал. (%FILE%
было выбрано, чтобы быть литералом, который иначе не встречался в строке. Выберите свой собственный, как вам нужно, но ввод имени помогает с удобочитаемостью.)