Вставить многострочную строку в другую строку

Мне нужно вставить строки в xml-файл:

Вставить

<one> </one> 

в

 <tags> </tags> 

Чтобы получить

 <tags> <one> </one> </tags> 

Я попробовал это:

 sed "s#\\(< /tags>\\)#${multiline_string}\1#" 

но он теряет отступы.

Как сказал Мат, отступы (и пробелы в целом) не важны в файлах XML. Эта:

 <one><tags></tags></one> 

В точности соответствует:

 <one> <tags> </tags> </one> 

Но это будет работать при сохранении отступов:

 $ cat myfile.xml <tags> </tags> $ sed '/<one>/ a\ <tags>\ </tags> ' myfile.xml > newfile.xml $ cat newfile.xml <one> <tags> </tags> </one> 

… но если вы работаете с XML, вы можете подумать об использовании языка более высокого уровня, который может фактически анализировать XML и манипулировать деревом программно.

Ниже приведен код мод, который вы указываете в вопросе.

Обратите внимание, что $'\n' является ksh (также поддерживаемым bash и zsh ) способом создания символа новой строки, поэтому при необходимости отрегулируйте его, если вы используете другую оболочку.

 sed "s|\(</tags>\)|${multiline_string//$'\n'/\n}\1|g" 

Зацепление g предназначено для ситуаций, когда вы можете иметь </tags> встречающиеся более одного раза в строке. Кажется, что это не нужно для вашего xml , но оно работает в любом случае.