Intereting Posts
У меня закончилась нехватка места в моем корневом разделе. Как мне расширить его с помощью свободного места? Вставить содержимое буфера обмена без X Как создать и автоматически синхронизировать «объединенный» каталог из нескольких других каталогов без дублирования файлов? Linux «ip route» изменяет адрес источника TCP, но не UDP Клавиатура с пользовательскими клавишами Отсутствует файл init.d / apache2 скрипт bash, вызывающий другой скрипт, вызывает отказ в файле журнала Должен ли я устанавливать переменную среды LANG или использовать локальный набор locatel? FreeBSD зашифрованное зеркало zfs – замените неисправный диск, включая зашифрованный своп UBS-Stick с Arch больше не загружается после загрузки Win8 Что именно отличает пользователя root от каждого другого пользователя? Что такое hotplug? Могу ли я установить dnf на debian? Используя стандартизацию, нужно, чтобы первая строка имела разный размер шрифта Получение прокси-сервера HTTPS для запуска моего кода

Заменить между шаблонами, которые начинаются и заканчиваются в разных строках

У меня есть файл со следующим форматом:

Whatever1 Whatever2 Whatever3 binaries=( text1 bin2 ohhh3 ) Whatever4 Whatever5 Whatever6 

Мне нужно заменить любые внутренние строки binaries=( и ) на вывод команды.

Я могу выбрать следующий блок с командой, например sed -n -e '/binaries=(/,/)/p' filename :

 binaries=( text1 bin2 ohhh3 ) 

Или еще лучше с этим awk '/binaries/,/)/{if(!/binaries|)/)print}' filename :

 text1 bin2 ohhh3 

Но, я должен сделать это, переписывая исходный файл, и я не знаю, как продолжить.

С GNU sed :

 sed '/binaries=(/,/)/{ //!d /)/e uname }' 

Замените uname вашей командой.

Я бы сделал это в awk, например:

 awk ' f && /)/ { f=0 } !f !f && /binaries=\(/ { f=1 ; p=1 } p { system ("your_command") ; p=0 } ' 

где «your_command» определит замену.

Объяснение: флаг f будет управлять конечным автоматом; если он установлен, вы находитесь в блоке, который должен быть заменен. При совпадении с шаблоном начала и конца соответствующий флаг изменяется соответствующим образом. Пока вы находитесь в блоке, системный вызов будет выполнен; флаг p используется для печати только один раз.

Чтобы заменить исходный файл, создайте новый файл и затем замените его оригиналом или используйте последнюю версию GNU awk с опцией -i inplace .