Ответы:
lead='^### BEGIN GENERATED CONTENT$'
tail='^### END GENERATED CONTENT$'
sed -e "/$lead/,/$tail/{ /$lead/{p; r insert_file
}; /$tail/p; d }" existing_file
r insert_file
должна быть последней на ее линии. Обратите внимание, что ни пробел, ни комментарии после него не допускаются. Код был протестирован с использованием GNU sed
с --posix
включенной опцией, и он работал как положено, поэтому он должен работать с любым posix-совместимым sed
.
output=$(sed -e "..." existing_file)
перехватили выходные данные sed (например, ), а затем выполнили замену во втором проходе (например echo "$output" > existing_file
), поскольку попытка перенаправления в файл, из которого вы читаете, приведет к его усечению до чтения содержимого.
newContent=`cat new_file`
perl -0777 -i -pe "s/(### BEGIN GENERATED CONTENT\\n).*(\\n### END GENERATED CONTENT)/\$1$newContent\$2/s" existing_file
Предупреждение: это определенно не самый простой способ сделать это. (РЕДАКТИРОВАТЬ: bash работает; POSIX grep тоже хорошо)
Если основной текст находится в файле «main», а сгенерированный контент - в файле «gen», вы можете сделать следующее:
#!/bin/bash
BEGIN_GEN=$(cat main | grep -n '### BEGIN GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
END_GEN=$(cat main | grep -n '### END GENERATED CONTENT' | sed 's/\(.*\):.*/\1/g')
cat <(head -n $(expr $BEGIN_GEN - 1) main) gen <(tail -n +$(expr $END_GEN + 1) main) >temp
mv temp main
main
для записи, очистки, прежде чем она будет прочитана кошкой.
ed -s FILE1 <<EOF
/### BEGIN GENERATED/+,/### END GENERATED/-d
/### BEGIN GENERATED/ r FILE2
w
q
EOF
r FILE2
вас можно сказать r !command
читать из другого скрипта.
sed
может сделать гораздо больше, чем простоs/.../...
!