Відповіді:
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
увімкненою опцією, і він працював як очікувалося, тому він повинен працювати з будь- яким сумісним позитором sed
.
output=$(sed -e "..." existing_file)
), а потім виконали заміну в другому проході (наприклад echo "$output" > existing_file
), оскільки спроба переспрямування у файл, з якого ви читаєте, призведе до скорочення до того, як вміст буде прочитаний.
Попередження: Це, безумовно, не найпростіший спосіб зробити це. (EDIT: 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/.../...
!