sed для замены любой записи в файле конфигурации

Я пытаюсь написать сценарий сборки для SLES / RHEL, который изменяет файлы конфигурации в соответствии с нашими стандартами компании. Некоторые конфигурации отформатированы как параметр = значение, а некоторые просто устанавливают значение. Я использую sed в настоящее время и чувствую, что я почти там, но он не работает, когда нет знака равенства.

Текущий код: (Извините, я не очень хорошо форматировал их еще …)

$ cat test.conf setting1 value1 setting2= value2 setting3 = value3 setting4 =value4 

Текущая (тестовая) функция:

 #!/bin/bash replace () { file=$1 var=$2 new_value=$3 sed -e "s/^$var=.*/$var = $new_value/" -e "s/^$var =.*/$var = $new_value/" -e "s/^$var.*/$var = $new_value/" -e "s/^$var /$var $new_value/" "$file"|grep $var } replace test.conf setting1 value1new replace test.conf setting2 value2new replace test.conf setting3 value3new replace test.conf setting4 value4new 

Однако я получаю это как результат:

 $ ./functiontest setting1 value1new= value1new setting2 value2new= value2new setting3 value3new= value3new setting4 value4new= value4new 

Он работает, если я вынимаю последнюю часть sed, но только там, где есть знак равенства.

Любые идеи, что я делаю неправильно?

2 Solutions collect form web for “sed для замены любой записи в файле конфигурации”

Вы можете упростить набор «похожих» подстановок sed к следующему:

 cat replace.sh #!/bin/bash replace () { var=$2 new_val=$3 sed -e "s/^$var *= *.*/$var = $new_val/; s/^$var [^=]*$/$var $new_val/" "$1" | grep $var } replace test.conf setting1 value1new replace test.conf setting2 value2new replace test.conf setting3 value3new replace test.conf setting4 value4new 

Использование :

 bash replace.sh 

Выход:

 setting1 value1new setting2 = value2new setting3 = value3new setting4 = value4new 
 sed -n "s/^$var[ =].*/$var = $new_value/p" "$file" 

Достаточно следовать за переменной с помощью пробела или знака равенства, тогда одна замена подходит для всех.

При использовании опции -n и p после замены вам не нужен grep . sed уже сделал правильную линию.

  • Объяснение для 'sed'
  • Команда sed не возвращает то, что я хочу
  • вопрос о совпадении пробелов
  • Переименование нескольких файлов, удаление всего одного экземпляра шаблона
  • Как добавить некоторую строку в соответствие с предыдущей строкой, сопоставленной с sed?
  • Как пропустить файл в sed, если он содержит регулярное выражение?
  • Замените обратную косую черту sed
  • Удалить только заданные строки из данной колонки?
  • Помощь с sed - удаление определенных строк с определенной строкой
  • Как печатать строки с номерами 15 и 25 из каждых 50 строк?
  • добавьте% 200 в конце строки «адрес 1.1.1.1»
  • Выделение ключевых слов с помощью стандартных утилит командной строки?
  • Linux и Unix - лучшая ОС в мире.