Ответ 1
f2="$(<file2)"
awk -vf2="$f2" '/StandardMessageTrailer/{print f2;print;next}1' file1
если вы хотите sed, здесь один из способов
sed -e '/StandardMessageTrailer/r file2' -e 'x;$G' file1
Как я могу вставить содержимое файла в другой файл прямо перед определенной строкой с помощью 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
но я хочу вставить его раньше.
оцените помощь
f2="$(<file2)"
awk -vf2="$f2" '/StandardMessageTrailer/{print f2;print;next}1' file1
если вы хотите sed, здесь один из способов
sed -e '/StandardMessageTrailer/r file2' -e 'x;$G' file1
Если вы можете выполнить два прохода, вы можете использовать маркер:
sed '/Standard/i MARKER' file1.xml | sed -e '/MARKER/r file2.xml' -e '/MARKER/d'
Проблема с попыткой сделать это за один проход заключается в том, что нет пути (который я знаю), кроме "r", чтобы вставить содержимое файла, а "r" делает это в выходном потоке, из досягаемость манипуляции, после sed заканчивается строкой. Поэтому, если "Стандарт" находится в последней строке, все, что вы делаете с ним, будет завершено появлением файла времени.
Обычно мне это нравится:
script фрагмент:
sed "\$r ${file2}" ${file1} > tmpfile
mv tmpfile ${file2}
Я попробовал разные решения, и один из Бета сделал для меня работу.
Резюме:
Пример:
Создайте 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