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

Я хотел бы заменить содержимое между $ 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 для простого поиска и замены. Я попытался найти ответ сам, но не повезло до этого момента.

2 Solutions collect form web for “замените блок текста содержимым файла”

С 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.
  • Заменить указанный символ между двумя строками?
  • значение столбца печати, основанное на совпадении имени столбца в awk / sed
  • Создание отдельной таблицы из нескольких файлов
  • Копирование слов из строк и добавление к строкам в другом файле
  • Обновите или добавьте JAVA_HOME с sed
  • Возвратная линия на следующей строке
  • заменяя содержимое одного файла другим
  • Согласование RegEx + удаление дополнительной строки
  • Неправильное поведение SED с входным файлом
  • Добавить строку после определенной строки в одной строке в текстовом файле
  • Удаление нежелательных строк в текстовом файле
  • Interesting Posts

    Не удается подключиться к WPA2, но соединение с WEP прекрасное

    Измените значения $ READLINE_LINE и $ READLINE_POINT внутри сценария bash

    пароль root недействителен

    Скопируйте несколько файлов и добавьте их в конец имени файла.

    Как настроить тысячи VLAN на сервере ISC DHCP-4.1.1-P1?

    Почему я все еще вижу MOTD при входе в SSH?

    Передать аргумент функции в определенную переменную

    Как экспортировать переменные, которые установлены, все сразу?

    В моем безопасном журнале добавлена ​​новая группа, о которой я не уверен после добавления семанажа

    Удаление LXDE и установка GNOME 3

    Как искать папку только с разрешением x (исполнение)

    Что делает простаивающий процесс ЦП?

    есть ли файловая система, что один и тот же путь к файлу перемещается в другой файл, когда к нему обращаются разные пользователи?

    Автоматизировать создание на работе, используя ожидание

    Средний щелчок двумя пальцами на сенсорной панели

    Linux и Unix - лучшая ОС в мире.