Синтаксические анализаторы/процессоры XML — это правильные инструменты для манипулирования XML-данными.
xmlstarletрешение:
примерное input.xml
содержание:
some text
text 1
some text
text 2
some text
xmlstarlet ed -a '//title' -t elem -n 'description' -v '' input.xml \
| xmlstarlet ed -u '//description' -x './preceding-sibling::title[1]/text()'
Выход:
some text
text 1 text 1
some text
text 2 text 2
some text
ed
-режим редактирования
-a
-добавить действие
-u
-действие обновления
То, что вам нужно, называется «включить охрану». Вы можете увидеть пример SO Джонатана Леффлера в https://stackoverflow.com/a/7518684/6512983.
if [ -z "$B_SH_INCLUDED" ]
then
B_SH_INCLUDED=yes
...rest of original contents of b.sh
fi
По сути, вы определяете переменную во включенном файле, но заранее проверяете ее существование и преждевременно возвращаете значение, если она уже определена.