2013-11-20 6 views
0

Я бы хотел найти и заменить переменные в файле conf в KSH (с SED). Мой вопрос: каков правильный шаблон регулярного выражения для определения переменных KSH (например, $ toto или $ {toto}), учитывая, что имя переменной может содержать специальные символы?Найти и заменить переменные SED в файле

Вот пример:

Скажем, у меня есть var_1=value1 и var_2=value2 в моей текущей оболочки (grepable в экспортном -p).

конфигурационный файл, прежде чем найти и заменить

PARAM1=$var_1/tata.txt 
PARAM2=${var_2}/tata.txt 

Файл конфигурации после того, как найти и заменить

PARAM1=value1/tata.txt 
PARAM2=value2/tata.txt 

Что я должен сделать:

  1. Найти $ var_1 и $ { var_2} в файле conf (с общим регулярным выражением, я полагаю, я не знаю, есть ли переменные в файле conf)
  2. Результаты поиска для каждого из export -p | grep var_1 и export -p | Grep var_2
  3. Замените эти 2 переменные в конфе файл значения найденного предыдущего поиском

Спасибо за ваши ответы.

+0

Укажите пример входного файла и ожидаемого результата. – anubhava

+0

@anubhava: Вот пример (непосредственно в сообщении) – pierrefevrier

ответ

0

Использование awk (я вижу, что вы просите sed)

awk '{gsub(/\${?var_1}?/,x);gsub(/\${?var_2}?/,y)}1' x="$var_1" y="$var_2" file 
PARAM1=value1/tata.txt 
PARAM2=value2/tata.txt 
+0

Спасибо, но я полагаю, что я не знаю имени переменных в файле conf (мне нужно что-то более общее) – pierrefevrier

+0

Тогда вам нужен скрипт bash, который запускает команду для каждой переменной. – Jotne

1

Это один из тех случаев, когда зло и опасноeval пригодится:

while read line; do 
    eval echo "$line" 
done <inputfile> outputfile 
+0

Интересно, но мне нужно проверить каждую переменную, если она существует в export -p (для обработки ошибок) – pierrefevrier

+1

@pfevrier Я не уверен, что я понимаю вас правильно, но если вы хотите, чтобы оболочка предложила вам попробовать заменить undefined variable, вы можете сказать: '(set -u; while read line; do eval echo" $ line "; done < inputfile > outputfile)'. Это даст ошибку, если переменная не определена. – devnull

+0

Я не знаю этот вариант, возможно, это решение.Я собираюсь проверить это :) – pierrefevrier

0
Src=/tmp/sed.Source 
FIn=/tmp/sed.In 
FOut=/tmp/sed.Out 

# take all variable as source but could be reduce (highly recommended) 
set > ${Src} 

cp YourFile ${FIn} 
sed 's/=/ /' ${Src} | while read vName vValue 
do 
    sed "s/\$$vName/$vValue/g;s/\${$vName}/$vValue/g" ${FIn} > ${FOut} 
    mv ${Fout} ${FIn} 
done 

#rm ${Src} 
cat ${Fin} 
#rm ${Fin} 

Основная проблема заключается в том, когда содержание (значение) переменная содержит регулярное выражение Specail полукокса как /.* так не самое лучшее решение для этого

может быть сделано в СЭД только остроумие преднагрузку переменной величины и маркер, чем рекурсивной замены

0

Вы можете попробовать этот Однострочник Обходное решение:

cat config 
PARAM1=$var_1/tata.txt 
PARAM2=${var_2}/tata.txt 

(export var_1=value1; export var_2=value2; bash -x ./config 2>&1 >/dev/null|sed 's/^+ //') 
PARAM1=value1/tata.txt 
PARAM2=value2/tata.txt 
Смежные вопросы