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

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

  • Замените строку в нескольких файлах, используя find и sed
  • Shell Script для удаления двойных кавычек в пределах значения столбца
  • GREP / SED или AWK: печать всего абзаца в файле по совпадению с образцом
  • Как заставить sed выполнять действия только в первом матче?
  • изменить файл с помощью awk или sed
  • Parse, Manipulate Data В linux / Unix
  • shell переименовывать имена файлов с непечатаемыми символами
  • Как передать определенное выражение?
  • 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 уже сделал правильную линию.

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