Intereting Posts
используйте сортировку GNU для сортировки по одному ключу / предотвращения нежелательной сортировки других ключей Как вычислить шестнадцатеричный xor (^) из оболочки? Мониторинг, если работающий сеанс X неактивен некоторое время Действительно ли Android использует то же ядро, что и Linux? Как установить python на debian? irc: уведомление о сообщениях, когда вы находитесь (xchat) Vim: объединить регулярные выражения Добавление 2 переменных в файл в сценарии ожидания поиск и подглаживание (и подстановочные знаки) Почему не работает этот нераспространен? Процесс, который блокирует, игнорирует SIGKILL, запускается (не зомби или в режиме бесперебойного сна). В каком состоянии? Клавиша remap altgr для AC10 в XKB Ошибка получения данных репозитория для epel, репозитория не найдена Fedora 22 не может найти ясность или какие команды logrotation – вращение и команда maxage

замените блок текста содержимым файла

Я хотел бы заменить содержимое между $ Elements $ и $ EndElements $ в текстовом файле f1, с данными из другого файла, f2.

Содержание f1 дается просто

$Elements$ 3 1 5 7 $EndElements$ 

И содержимое f2 дается как

 1 65 71 2 32 87 3 39 98 4 41 63 

Я хотел бы получить в конце:

 $Elements$ 1 65 71 2 32 87 3 39 98 4 41 63 $EndElements$ 

Для этого я попробовал некоторый sed-код с страниц stackexchange (ну, я скопировал код и больше не открывал окно, поэтому я не могу предоставить прямую ссылку, извините)

 lead='^\$Elements\$$' tail='^\$EndElements\$$' # f2 is the file where the information # to replace is kept in sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file > }; /$tail/p; d }" f2 

который не работает, в основном ничего не делая.

Я не гуру командной строки, но использовал sed для простого поиска и замены. Я попытался найти ответ сам, но не повезло до этого момента.

С ed(1) :

 echo -e '/\$Elements\$/+1,/\$EndElements\$/-1d\n.-1r f2\nw' | ed -s f1 

В деталях:

  • /\$Elements\$/+1,/\$EndElements\$/-1 соответствуют строкам между $Elements$ и $EndElements$
  • d удаляет указанные строки
  • .-1 теперь является строкой выше $EndElements$
  • r f2 читает файл f2
  • w записывает результаты.
 sed -e " /$lead/,/$tail/!b //!d /$lead/r f2 " f1 

Результаты

 $Elements$ 1 65 71 2 32 87 3 39 98 4 41 63 $EndElements$ 

За работой

  1. Сначала мы выбираем правильный диапазон, используя оператор запятой.
  2. Все строки, которые не попадают в этот диапазон, печатаются, как и через команду b , которая передает управление в конец sed-кода для этой строки.
  3. Тело диапазона удаляется, //!d так как мы намерены заменить тело диапазона специальным файлом f2.
  4. Ведущая строка, когда она встречается, читает в содержимом пользовательского файла f2 в очереди печати (которая не совпадает с пространством шаблона, заметьте).
  5. Когда элемент управления достигнет конца sed-кода, содержимое пространства шаблонов, удерживающее ведущую строку, опустошенную на stdout и ПОСЛЕ этого события, представляет собой содержимое очереди, опустошенное на stdout.