
В настоящее время я пытаюсь автоматизировать обновление текста файла с названием 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 до строки со специальным содержимым. Я печатаю эти строки явно с помощью
p
и затем вызываюd
, чтобы принудительно начать новый цикл ("print; next
" вawk
). - После того, как первый блок вывел начальные строки, второй блок выводит содержимое дополнительного файла.
- После этого сценарий редактирования завершается.
Обычно 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