как отредактировать следующую строку после сопоставления шаблона и добавить строку, если она не существует

Я ищу изменение содержимого файла, которое повторяется дважды с этой заменой. Я хочу добавить дополнительную строку ко второму содержимому в том же файле

Пример файла

User YOURNAME IdentityFile ~/.ssh/YOURKEY . . . User YOURNAME Installing Installing 

Пример Результат после запуска скрипта

 User adminuser IdentityFile ~/.ssh/id_rsa . . . User adminuser IdentityFile ~/.ssh/id_rsa Installing Installing 

Я могу изменить user и YOURKEY с помощью команды ниже sed

 `sed- is/"YOURNAME/adminuser"/g /root/.ssh/config` `sed -i 's/YOURKEY/id_rsa/g' ff1` 

Но я не могу вставить IdentityFile ~/.ssh/id_rsa в следующую строку.

отредактированный

Дополнительная информация ****User adminuser имеет место в начале строки. Эти файлы синхронизируются на ежедневных базах, поэтому не удаляйте строку IdentityFile . После синхронизации он будет заменен

Окончательное редактирование, которое работает по мере необходимости

 perl -i -ne 'next if /IdentityFile/; s#YOURNAME#adminuser\n IdentityFile ~/.ssh/id_rsa#; print' filename 

2 Solutions collect form web for “как отредактировать следующую строку после сопоставления шаблона и добавить строку, если она не существует”

Просто удалите все случаи IdentityFile а затем добавьте их снова явно:

 $ perl -i -ne 'next if /IdentityFile/; s#YOURNAME#adminuser\nIdentityFile ~/.ssh/id_rsa#; print' file $ cat file User adminuser IdentityFile ~/.ssh/id_rsa . . . User adminuser IdentityFile ~/.ssh/id_rsa Installing Installing 

next if /IdentityFile/ пропускает любые строки, соответствующие IdentityFile . s#YOURNAME#adminuser\nIdentityFile ~/.ssh/id_rsa# заменит любой экземпляр YOURNAME на adminuser , новую строку и строку IdentityFile . Окончательная print печатает все строки.

Отчасти проблема заключается в том, что ваш шаблон несовместим: первое вхождение имеет строку IdentityFile , а вторая – нет . Вы можете сделать это согласованным, сначала удалив существующие строки IdentityFile , а затем добавив нужные строки.

Чтобы удалить строки:

 sed -i '/^IdentityFile /d' filename 

Чтобы добавить строки, вы можете сделать это в sed , сопоставляя строку User и добавляя строку, например,

 sed -e '/^User /'a'\ IdentityFile ~/.ssh/id_rsa' filename 
  • Сценарий оболочки для проверки состояния точки монтирования на сервере linux
  • Как работает эта функция bash?
  • как перемещать (не копировать) файлы с одного сервера на другой?
  • Выйти из цикла while при ошибке
  • Есть ли опция / команда для дифференциации файлов на основе состояния копии файла в каталоге?
  • file command + как просмотреть все результаты из команды file
  • Сценарий Bash не работает как cronjob
  • Как получить имя пользователя, выполнившего скрипт bash как sudo?
  • Перебирайте строки файла, файла раздела и классифицируйте каждый раздел
  • bash ест мою строку
  • Команда Ubuntu runuser?
  • Проверка скрипта выполняется
  • Interesting Posts

    Преобразование вывода команды «lsque -q»

    find command, есть ли способ получить отчет о проделанной работе?

    Докерные решения для контейнеров OpenVZ

    Прозрачное шифрование истории bash?

    обновить почтовый клиент Evolution

    Ожидаемое поведение `find -depth`, если разрешение на выполнение запрещено для подкаталога?

    Мониторинг портов на маршрутизаторе NAT на основе GNU / Linux

    как приостановить другие не связанные процессы, чтобы позволить процессам, заинтересованным в занятии ЦП?

    Как я могу сделать eth1 и всегда доступным для удаленного доступа, где eth0 будет использоваться для хоста с IPSec VPN?

    Удаленная командная строка syslog Клиент

    Добавить в файл1 по различиям в конкретном столбце между двумя файлами

    Как включить дерево каталогов для резервного копирования с помощью cpio?

    Как обрабатывать управление несколькими машинами-точками

    жалуются "отсутствующий разделитель (вы имели в виду TAB?)"

    Как именно «до $ @» работает в сценариях bash?

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