Редактируйте несколько строк из определенного раздела 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 изменяет содержимое пространства шаблонов.

  • добавьте «#» в начале выбранных строк в файле
  • Как связывать линии между шаблоном начала и конца?
  • Удалите все повторяющиеся слова из строки, используя сценарий оболочки
  • Как я могу получить много адресов из многих траекторий с помощью сценария bash без ошибок?
  • Как копировать и вставлять строки между ключевым словом start и end?
  • Разделение строки до определенного места
  • У вас проблемы с командой sed на Linux
  • Как сопоставить и заменить значение атрибута внутри тега
  • Извлечение нескольких экземпляров текста между двумя словами, включая стартовое слово, но исключающее слово
  • Создать в HTML из вывода скрипта bash
  • Элегантный способ подсчета, сколько раз шаблоны из файла встречаются в другом файле
  • Linux и Unix - лучшая ОС в мире.