Intereting Posts
Могут ли файлы меняться при переходе от ext2 к ext3 в ext4? Перечислить все программное обеспечение, установленное из определенного компонента (не бесплатно, вклад) grep и напечатать, сколько раз мой шаблон в файле 1 присутствует в файле2 Сравните два файла с awk и условием KGet: восстановление соединения после сброса модема Как я могу получить / доступное пространство с помощью «df» и вывести его в файл журнала? удалите строки, содержащие диапазон IP из определенного столбца, делая исключения в диапазоне Отобразить дерево subvolume btrfs Testprintenv: ошибка при загрузке разделяемых библиотек: libodbc.so.1: невозможно открыть файл общих объектов Размер внутреннего буфера wget Crunchbang не видит существующей установки Ubuntu Восстановить данные из рейда 1, когда оба диска неисправны PulseAudio не будет работать в системном режиме Что такое командные праймериз? Как я могу обмениваться файлами между двумя машинами Linux по локальной сети?

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

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

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 .