2013-11-07 3 views
0

Я пытаюсь использовать sed для выполнения встроенного поиска и замены, но я думаю, что странные символы вызывают проблемы.Использование переменных с sed, но имеющих проблемы с экранированием

Мой файл config.inc содержит 2 строки:

$GLOBALS['industry_id'] = '1'; 
yyyy 

что-то простое, как это работает, и заменяет гггг с ZZZZ:

x="yyyy" 
y="zzzz" 
sed -i "s/${x}/${y}/" config.inc 

Но что-то вроде этого не работает:

x="$GLOBALS['industry_id'] = '1';" 
y="$GLOBALS['industry_id'] = '3';" 
sed -i "s/${x}/${y}/g" config.inc 

Нужно ли мне избегать символов типа $ [] '; (хотя это также не работает):

x="\$GLOBALS\[\'industry_id\'\] = \'1\'\;" 
y="\$GLOBALS\[\'industry_id\'\] = \'3\'\;" 
sed -i "s/${x}/${y}/g" config.inc 

Что мне не хватает?

Благодаря Chris

UPDATE: Ok благодаря pfnuesel следующие работы:

x="\\\$GLOBALS\\['industry_id'\\] = '1';" 
y="$GLOBALS['industry_id'] = '3';" 
sed -i "s/${x}/${y}/g" config.inc 
+0

Отсутствует символ escape: 'y =" \ $ GLOBALS ['industry_id'] = '3'; "' (так как '' 'должен быть экранирован в bash). – pfnuesel

ответ

1

'$' имеет особое значение в bash (расширение параметров), вам нужно, чтобы избежать он, т.е.

$ x="\$GLOBALS['industry_id'] = '1';" 

Теперь у вас есть

$ echo $x 
> $GLOBALS['industry_id'] = '1'; 

Но если вы попытаетесь команду sed, он все еще не работает, потому что $ также имеет особое значение в sed (конец строки). Также [ и ] имеют специальные значения в sed, нам нужно избегать их всех. Так как escape-символ \ также имеет особое значение, нам также нужно избегать его.

$ x="\\\$GLOBALS\\['industry_id'\\] = '1';" 

Если теперь мы делаем

$ echo $x 
> \$GLOBALS\['industry_id'\] = '1'; 

т.е. один экранирующий символ перед специальными символами $, [ и ].

Обратите внимание, что это не является необходимым для y, так как ни $, ни [ или ] имеют особое значение в строке должны быть заменены (только в строке, чтобы быть замещенным).

+0

Я просто попробовал следующее и не работал: 'x = '\ $ GLOBALS [' industry_id '] =' 1 ';'' 'y =" $ GLOBALS ['industry_id'] = '3' ; '' 'sed -i 's/$ {x}/$ {y}/g" config.inc' –

+0

Спасибо, что сработали! –

Смежные вопросы