замена переменных sed не работает - PullRequest
0 голосов
/ 07 января 2011

Я установил переменную в оболочке:

-bash-3.00$ echo $source_repl
source ../setup_simple.tcl

Затем я попытался заменить строку в файле, начинающуюся со строки «package require IxLoad», на строку переменной (отметив, что двойные кавычкиспособ заставить sed использовать подстановку переменных).Сначала я попытался с прямой заменой (без экранирования $ в переменной):

-bash-3.00$ sed -e "s/package require IxLoad.*/$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
sed: -e expression #1, char 38: unknown option to `s'
-bash-3.00$

Поэтому я подумал, что экранирование $ решит проблему, но, как вы можете видеть, строка заменяется литеральной строкой.«$ source_repl», а не хранящаяся там переменная:

-bash-3.00$ sed -e "s/package require IxLoad.*/\$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
-bash-3.00$ diff smtp_tput191Mb.tcl tmpwatch.tcl
11c11
< package require IxLoad
---
> $source_repl
-bash-3.00$ 

Я просмотрел множество сайтов о том, как выполнять замену переменных в sed, и все они, похоже, указывают на то, что вышеприведенное должно работать.Что мне не хватает?Есть ли что-то в фактической переменной, которая вызывает это?

A

Ответы [ 3 ]

1 голос
/ 07 января 2011

Я не знаю, как обойти эту проблему в целом (изменение разделителей легко, но вы никогда не знаете, что может быть в переменной), но если вы можете использовать perl вместо sed, вы может загрузить форму переменной среды внутри perl, чтобы избежать проблемы с экранированием:

perl -pe 's/package require IxLoad.*/$ENV{source_repl}/g' smtp_tput191Mb.tcl > tmpwatch.tcl
1 голос
/ 07 января 2011

В вашей переменной есть /. Используйте @ в качестве разделителя шаблонов, и это пойдет.

sed -e "s@package require IxLoad.*@$source_repl@g" smtp_tput191Mb.tcl > tmpwatch.tcl
0 голосов
/ 07 января 2011

Извините за потраченное время, ребята. Я нашел проблему. Мне нужно было экранировать точки и косые черты в фактической переменной, чтобы заменить ее оператором sed:

-bash-3.00$ echo $source_repl
source \.\.\/setup_simple\.tcl
-bash-3.00$ sed -e "s/package require IxLoad.*/$source_repl/g" smtp_tput191Mb.tcl > tmpwatch.tcl
-bash-3.00$ diff smtp_tput191Mb.tcl tmpwatch.tcl                                          11c11
< package require IxLoad
---
> source ../setup_simple.tcl
-bash-3.00$

Спасибо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...