Редактируйте несколько строк из определенного раздела INI-файла

У меня есть файл конфигурации subversion ( ~/.subversion/servers )

Мне нужно изменить, чтобы добавить информацию прокси (хост, порт, исключения). Этот файл содержит много разделов с информацией прокси. Я хочу изменить [global] .

Я уже создал для этого регулярное выражение, но оно не работает.

 /(\[global\].*[\n])((.*[\n])*)([\s\#]*http-proxy-port\s?=\s?.*)/gm 

Вы можете попробовать онлайн-тест с https://regex101.com/, и он отлично подходит для замены:

 \1\2http-proxy-port=9000 

Я стараюсь, чтобы sed выполнял строку выше и ни слова.

 sed -i -r 's/(\[global].*[\n])((.*[\n])*)([\s\#]*http-proxy-port\s?=\s?.*)/\1\2http-proxy-port=9000/gm' \ ~/.subversion/servers 

Как я могу заставить sed работать с вышеупомянутым регулярным выражением?

Этот пример файла subversion:

 ### The currently defined server options are: ### http-proxy-host Proxy host for HTTP connection ### http-proxy-port Port number of proxy host service ### http-proxy-username Username for auth to proxy service ### http-proxy-password Password for auth to proxy service ### http-proxy-exceptions List of sites that do not use proxy ### http-timeout Timeout for HTTP requests in seconds [groups] # group1 = *.collab.net # othergroup = repository.blarggitywhoomph.com # thirdgroup = *.example.com ### Information for the first group: # [group1] # http-proxy-host = proxy1.some-domain-name.com # http-proxy-port = 80 # http-proxy-username = blah # http-proxy-password = doubleblah # http-timeout = 60 ### Information for the second group: # [othergroup] # http-proxy-host = proxy2.some-domain-name.com # http-proxy-port = 9000 ### SSL certificate. See details above for overriding security ### due to SSL. [global] # http-proxy-exceptions = *.domain.org, *.domain.com # http-proxy-host = proxy.domain.com # http-proxy-port = 8080 # http-proxy-username = defaultusername # http-proxy-password = defaultpassword 

Ожидаемый результат будет

 ... [global] http-proxy-exceptions = *.otherdomain.org, *.otherdomain.com, 127.0.0.1, localhost http-proxy-host = proxy.otherdomain.com http-proxy-port = 9000 # http-proxy-username = defaultusername # http-proxy-password = defaultpassword 

One Solution collect form web for “Редактируйте несколько строк из определенного раздела INI-файла”

Как было предложено, есть лучшие способы редактирования файлов INI …
Тем не менее, вот один из способов с sed :

 sed '/^\[.*\]/h /http-proxy-exceptions/{x;/\[global\]/!{x;b;};x;c\ http-proxy-exceptions = *.otherdomain.org, *.otherdomain.com, 127.0.0.1, localhost } /http-proxy-host/{x;/\[global\]/!{x;b;};x;c\ http-proxy-host = proxy.otherdomain.com } /http-proxy-port/{x;/\[global\]/!{x;b;};x;c\ http-proxy-port = 9000 }' infile 

Это перезаписывает буфер удержания содержимым пространства шаблонов каждый раз, когда он встречает строку, соответствующую [.*] (Т. Е. Сохраняет имя каждого раздела в h старый буфер). В каждой строке, которая соответствует вашим шаблонам http-.* E x изменяет буферы – если пространство удержания не соответствует ( ! ), Соответствует [global] тогда e x изменяется назад и переходит к следующему циклу через b . Если пространство удержания совпадает с [global] e x изменяется назад, а c изменяет содержимое пространства шаблонов.

  • Добавить кавычки и новый разделитель вокруг слов, разделенных пробелами
  • Как проверить, имеет ли файл уже строку с содержимым?
  • Получите первое соответствие шаблону в строке, не использующей разрез
  • Разделите базовое имя файла, сохраните часть каталога
  • Помощь с повторением поля A в CSV-файле, где поле B имеет указанное значение
  • Отменить перемещение букв с помощью sed
  • Текст между двумя тегами
  • Найти последнее появление строки в нескольких файлах
  • Как сделать просмотрщик PDF восприимчивым к изменениям в Debian
  • Добавить столбцы в текстовый файл с заданным интервалом в Bash
  • Усеченный результат, возвращаемый JOIN
  • Linux и Unix - лучшая ОС в мире.