Подтвердить что ты не робот

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

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

example У меня есть файл1.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 в файл1 непосредственно перед

<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  

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

оцените помощь

4b9b3361

Ответ 1

f2="$(<file2)"
awk -vf2="$f2" '/StandardMessageTrailer/{print f2;print;next}1' file1 

если вы хотите sed, здесь один из способов

sed  -e '/StandardMessageTrailer/r file2' -e 'x;$G' file1

Ответ 2

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

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

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

Ответ 3

Обычно мне это нравится:

  • file1, файл для чтения содержимого вставки
  • file2, вставьте содержимое чтения из file1 в начало file2
  • script фрагмент:

    sed "\$r ${file2}" ${file1} > tmpfile
    mv tmpfile ${file2}

Ответ 4

Я попробовал разные решения, и один из Бета сделал для меня работу.

Резюме:

  • Я хотел вставить разные файлы в основной файл
  • Я хотел использовать маркеры, чтобы сказать, где я хочу, чтобы эти файлы были вставлены

Пример:
Создайте 2 файла:

cloud_config.yml:

coreos:
__ETCD2__

etcd2.yml:

  etcd2:
    name:                         __HOSTNAME__
    listen-peer-urls:             http://__IP_PUBLIC__:2380
    listen-client-urls:           http://__IP_PUBLIC__:2379,http://127.0.0.1:2379

Затем мы запустим на нем script:

sed '/Standard/i __ETCD2__' cloud_config.yml \
| sed -e "/__ETCD2__/r etcd2.yml" > tmpfile
sed "s|__ETCD2__||g" tmpfile > cloud_config.yml

Наконец, мы получили следующее:

coreos:
  etcd2:
    name:                         __HOSTNAME__
    listen-peer-urls:             http://__IP_PUBLIC__:2380
    listen-client-urls:           http://__IP_PUBLIC__:2379,http://127.0.0.1:2379