rmarimon rmarimon - 6 months ago 19
Bash Question

Replace delimited block of text in file with the contents of another file

I need to write a simple script to replace a block of text in a configuration file with the contents of another file.

Let's assume with have the following simplified files:

server.xml


<?xml version='1.0' encoding='UTF-8'?>
<Server port="8005" shutdown="SHUTDOWN">
<Service name="Catalina">
<Connector port="80" protocol="HTTP/1.1"/>
<Engine name="Catalina" defaultHost="localhost">
<!-- BEGIN realm -->
<sometags/>
<sometags/>
<!-- END realm -->
<Host name="localhost" appBase="webapps"/>
</Engine>
</Service>
</Server>


realm.xml


<Realm className="org.apache.catalina.realm.UserDatabaseRealm"
resourceName="UserDatabase"/>


I want to run a script and have
realm.xml
replace the contents between the
<!-- BEGIN realm -->
and
<!-- END realm -->
lines. If
realm.xml
changes then whenever the script is run again it will replace the lines again with the new contents of
realm.xml
. This is intended to be run in
/etc/init.d/tomcat
on startup of the service on multiple installations on which the realm is going to be different.

I'm not so sure how can I do this simply with
awk
or
sed
.

Answer

Give this a try:

sed -i -ne '/<!-- BEGIN realm -->/ {p; r realm.xml' -e ':a; n; /<!-- END realm -->/ {p; b}; ba}; p' server.xml