Как может, я могу вставить содержание файла в другой файл прямо перед определенной строкой с помощью sed?
пример у меня есть file1.xml, который имеет следующее:
<field tagRef="376">
</field>
<field tagRef="377">
</field>
<field tagRef="58">
</field>
<group ref="StandardMessageTrailer" required="true"/>
</fieldList>
</message>
и file2.xml имеет следующее:
<field tagRef="9647">
<description>Offset</description>
</field>
<field tagRef="9648">
<description>Offset Units/Direction</description>
</field>
<field tagRef="9646">
<description>Anchor Price</description>
</field>
как я могу вставить содержание file2 в file1 незадолго до
<group ref="StandardMessageTrailer" required="true"/>
таким образом, это будет похоже на это:
<field tagRef="376">
</field>
<field tagRef="377">
</field>
<field tagRef="58">
</field>
<field tagRef="9647">
<description>Offset</description>
</field>
<field tagRef="9648">
<description>Offset Units/Direction</description>
</field>
<field tagRef="9646">
<description>Anchor Price</description>
</field>
<group ref="StandardMessageTrailer" required="true"/>
</fieldList>
</message>
Я знаю, как вставить после того использования строки
sed 'group ref="StandardMessageTrailer"/r file2.xml' file1.xml > newfile.xml
но я хочу вставить его прежде.
цените справку
Если вы можете выдержать два прохода, вы может использовать маркер:
sed '/Standard/i MARKER' file1.xml | sed -e '/MARKER/r file2.xml' -e '/MARKER/d'
Проблема с попыткой сделать это за один проход заключается в том, что нет другого способа (который я знаю), кроме 'r', вставить содержимое файла, а 'r' делает это в выходной поток, недоступный для манипуляций, после того, как sed завершил работу со строкой. Так что, если «Стандарт» находится в последней строке, все, что вы с ним делаете, будет закончено к тому времени, когда появится file2.
f2="$(<file2)"
awk -vf2="$f2" '/StandardMessageTrailer/{print f2;print;next}1' file1
Если вам нужен sed, вот один способ
sed -e '/StandardMessageTrailer/r file2' -e 'x;$G' file1