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, но только там, где есть знак равенства.

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

  • Заменить только в определенной строке диапазона
  • Замена определенного номера в файлах unix
  • Как отобразить только последнюю строку списка?
  • Объединить xargs -I с sed
  • Sed заменяет части строк не начиная с http: //
  • Добавить текст до конца каждой строки
  • Каково использование шаблона перед заменой команды в 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 уже сделал правильную линию.

    Interesting Posts

    Как синхронизировать историю команд терминала в bash?

    Реализация балансировки нагрузки на любом дистрибутиве Linux

    С какой BSD начать?

    Задержка загрузки из-за несуществующего диска SATA

    Сценарий оболочки: найдите выделенные программы, если они есть, активируйте его

    Могу ли я настроить оболочку для печати STDERR и STDOUT в разных цветах?

    Вставьте выбранное имя файла во время копирования в Midnight Commander

    Шифрование файлов Yubikey без использования OpenPGP?

    Отображение подсказки из команды ssh

    Вывод одной команды передается на другой; как закрыть оба?

    Является ли символ `\` escape или становится частью моего пароля ssh key

    Почему меню или элемент по правому клику не могут быть настроены с помощью menu.xml?

    Wikilink к символической ссылке в ikiwiki

    логический том, логический диск, том, раздел, физический диск и файловая система

    Как выбрать текст с прокруткой мыши в vim?

    Linux и Unix - лучшая ОС в мире.