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

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

  • sed предотвращает удаление остальной линии
  • Присоединение нескольких команд sed в одном скрипте для обработки CSV-файла
  • awk: Столбцы не печатаются, когда конкатенация строк передается как командная строка
  • sed: удалить все совпадения в файле и вставить некоторые строки, в которых первое совпадение было
  • sed разделить верилогическую шину на отдельный порт
  • Заменить значения в файле
  • Использовать аргумент командной строки и переменную с помощью sed Inside Bash Script
  • Извлечение битрамов с помощью 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

    Необходимо отфильтровать данные на основе двух столбцов, имеющих много отношений, используя awk

    Почему мое имя пользователя вдруг добавило @dhcp?

    Ошибка Pacman: не удалось открыть файл: / etc / mtab: Нет такого файла или каталога

    Почему rsync в сухом режиме перечисляет некоторые каталоги, а не другие?

    AIX NIM Master реплицирует / синхронизирует с альтернативным мастером

    Как мне pg_upgrade моя база данных в Arch Linux?

    Вход в дистрибутив GNU / Linux занимает слишком много времени

    echo \\ * – bash backslash escape-поведение, оценивается ли он назад?

    Почему ls отображает несуществующий файл?

    Исключить пути, которые заставят find жаловаться на разрешения

    ssh, запустить определенную оболочку и запустить команду на удаленном компьютере?

    Почему моя .bash_history содержит повторяющиеся сегменты?

    Ошибка MDADM RAID 0

    NvidiaSettings не работает над Bumblebee Arch Linux

    Понимание командной строки Bash's Read-a-File

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