Как может, я могу вставить содержание файла в другой файл прямо перед определенной строкой

Как может, я могу вставить содержание файла в другой файл прямо перед определенной строкой с помощью 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  

но я хочу вставить его прежде.

цените справку

19
задан Paused until further notice. 25 March 2010 в 05:54
поделиться

2 ответа

Если вы можете выдержать два прохода, вы может использовать маркер:

sed '/Standard/i MARKER' file1.xml | sed -e '/MARKER/r file2.xml' -e '/MARKER/d'

Проблема с попыткой сделать это за один проход заключается в том, что нет другого способа (который я знаю), кроме 'r', вставить содержимое файла, а 'r' делает это в выходной поток, недоступный для манипуляций, после того, как sed завершил работу со строкой. Так что, если «Стандарт» находится в последней строке, все, что вы с ним делаете, будет закончено к тому времени, когда появится file2.

4
ответ дан 30 November 2019 в 04:29
поделиться
f2="$(<file2)"
awk -vf2="$f2" '/StandardMessageTrailer/{print f2;print;next}1' file1 

Если вам нужен sed, вот один способ

sed  -e '/StandardMessageTrailer/r file2' -e 'x;$G' file1
20
ответ дан 30 November 2019 в 04:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: