Добавить строку после определенной строки в одной строке в текстовом файле

Я пытаюсь добавить строку в ту же строку в текстовом файле. Я использовал следующий метод.

sed -i "s/\bmembers\b/& \t$host,/" printer.cfg 

Он добавит строку после строки членов, а также добавит вкладку, чтобы сделать ее правильной.

Я получу такой результат,

 define hostgroup{ hostgroup_name HOSTGROUP ONE alias Host Group 1 Printers members foo0, foo1, bar2, foo2, bar3 } 

Где foo0 – моя добавленная строка, использующая выше sed.

Но проблема в том, что есть один текстовый файл, содержащий много строк «членов».

например

 define hostgroup{ hostgroup_name HOSTGROUP ONE alias Host Group 1 Printers members foo1, bar2, foo2, bar3 } define hostgroup{ hostgroup_name HOSTGROUP TWO alias 2nd Host Group members example1, example3, example2 } 

В этом выше примере я хочу добавить строку ТОЛЬКО в первом пара (hostgroup_name HOSTGROUP ONE). В этом случае, как я могу ссылаться на hostgroup_name и добавлять текст после строки «members» с одной вкладкой?

  • xdotool печатает 8 вместо Tab
  • Сценарий оболочки, написанный в другой оболочке, чем моя текущая оболочка
  • Проверка вывода команды, не совсем работающей с помощью скрипта BASH
  • Сценарий оболочки Linux удаляет определенное содержимое в файле
  • извлечение данных из файла журнала и построение его с использованием Gnuplot
  • Конкретная замена уровня столбца
  • BASH: группировка файлов по имени
  • Как проверить, установлен ли mysql с помощью сценария bash?
  • 2 Solutions collect form web for “Добавить строку после определенной строки в одной строке в текстовом файле”

    Два подхода:

    sed подход:

     sed "0,/members/{s/\bmembers */&$host, /}" printer.cfg 
    • 0,/members/ – диапазон адресов, занимающий ряд строк, начиная с 1-й строки до первого появления шаблона members

    awk- подход:

     awk -vh=$host '!f && /members /{ $2=sprintf("%8s, %s",h,$2); f=1 }1' printer.cfg 

    Выход (для обоих подходов):

     define hostgroup{ hostgroup_name HOSTGROUP ONE alias Host Group 1 Printers members foo0, foo1, bar2, foo2, bar3 } define hostgroup{ hostgroup_name HOSTGROUP TWO alias 2nd Host Group members example1, example3, example2 } 

    Следуйте трехэтапному процессу выбора, хранения и формирования диапазона интересующих данных. Последняя задача печати в stdout – автозагрузка sed .

     host='Foo_0'; sed -Ee ' # Step-1: SELECT RANGE /^define hostgroup[{]/,/^[}]/!b # Step-2: SAVE RANGE DATA H; /^define hostgroup[{]/h; /^[}]/!d # Step-3: SHAPE RANGE DATA g;/\nhostgroup_name\s+HOSTGROUP ONE/s/\nmembers\s+/&'"${host}"', / ' printer.cfg 
    Linux и Unix - лучшая ОС в мире.