Как заменить ВЕСЬ текст в файле после определенной строки содержимым другого текстового файла, используя sed/awk?

Как заменить ВЕСЬ текст в файле после определенной строки содержимым другого текстового файла, используя sed/awk?

В настоящее время я пытаюсь автоматизировать обновление текста файла с названием original_file.txt. Представьте, что файл выглядит следующим образом:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
text_that_will
be_removed
after_the_command

Этот файл будет обновлен путем удаления всего текста после «Заменить все после этой строки» и замены его текстом из файла.файл_замены.txt. Ради поста представьте, что replacement_file.txt имеет следующий текст:

testing123
this_is_the_replacement_text

Из того, что мне удалось найти с помощью sed, я могу понять только, как редактировать остаток строки после определенной фразы. Я хочу заменить текст в original_file.txt после заменяющей фразы всем текстом из replacement_file.txt (я хочу сохранить текст заменяемой строки для будущих обновлений). original_file.txt должен выглядеть так в конце:

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Заранее спасибо!

решение1

В GNU/awk:

Назовите два файла в качестве аргументов.

awk '{ print; } /^### REPLACE EVERYTHING AFTER THIS LINE ###$/ { nextfile; }' fn1 fn2

решение2

Вывести все строки, пока не будет найдена строка «заменить после», затем прочитать из другого файла и выйти:

sed '/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{r replacement_file.txt
q;}' original_file.txt

  • используйте sed -iдля сохранения изменений
  • или... > tmp && mv tmp original

решение3

С использованием sed:

sed -n -e '1,/^### REPLACE EVERYTHING AFTER THIS LINE ###$/{ p; d; }' \
       -e 'r replacement_file.txt' \
       -e 'q' original_file.txt

Вот три sedблока, которые это делают:

  1. Первый блок печатает все строки от строки 1 до строки со специальным содержимым. Я печатаю эти строки явно с помощью pи затем вызываю d, чтобы принудительно начать новый цикл (" print; next" в awk).
  2. После того, как первый блок вывел начальные строки, второй блок выводит содержимое дополнительного файла.
  3. После этого сценарий редактирования завершается.

Обычно qв третьем блоке выводится текущая строка перед выходом (это будет строка в примере чтения данных text_that_will), но поскольку sedвызывается с помощью -n, этот вывод строки по умолчанию в конце цикла запрещен.

Результатом вышеприведенной команды, с учетом ваших данных, будет

common_text
### REPLACE EVERYTHING AFTER THIS LINE ###
testing123
this_is_the_replacement_text

Чтобы обновить исходный файл, можно использовать sed -i ...или перенаправить вывод в новый файл, которым затем заменить исходный:

sed ... original_file.txt >original_file.txt.new &&
mv original_file.txt.new original_file.txt

решение4

если используется gnu Awk:

awk '{print} /### REPLACE.../{system("cat replacement"); exit 0}' file

Связанный контент