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

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

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» с одной вкладкой?

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 
  • Как добавить папку на удаленный хост PATH с помощью сценария оболочки?
  • Отправить копию вывода скрипта в файл
  • Как отключить, как часто передаются строки вывода?
  • Используйте переменную ссылку «внутри» другой переменной
  • Скопируйте файлы из каталога, если имя присутствует в текстовом файле
  • Как создать интерактивный скрипт bash для сбора аргументов для команды в Linux?
  • Как найти все квадратные изображения в каталоге
  • Shell-скрипт: весь каталог удаленного ftp-сервера
  • Порядок обработки и печать файлов с помощью find
  • Переименовать все пробелы в именах файлов изображений внутри html php-файлов
  • скрипт init.d не запускается при загрузке
  • Interesting Posts

    Скажите ли вы, что FreeBSD более стабильна, чем Linux?

    Как пропустить проверку DNS, пока я отключен от Интернета

    вырезать фрагмент файла в зависимости от времени написания строк

    Подключите USB-накопитель без разделов с помощью правил udev

    Оберните первый символ строки, используя sed

    Есть ли LC_COLLATE, который сортирует точку перед тире?

    Сортировка входного файла по результатам регулярного выражения

    Изменение имени пользователя по-прежнему оставляет старые следы

    Запись на диск перед установкой

    Как расширить / загрузить раздел на Ubuntu 15.10?

    Как я могу автоматизировать черепицу окна с пользовательской шириной? (Корица)

    Как найти только исполняемые файлы, используя «locate»?

    Fedora 26 замерзает и падает после обновления

    Как я могу добавить действие в Nemo (Linux Mint) для воспроизведения нескольких mp3-файлов в плейлисте vlc?

    Samba не хватает свободного места

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