0

Hi have an xml file as below.

<Context path="/jasperserver-pro" reloadable="false">
    <Resource name="jdbc/jasperserver" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/jasperserver?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
    <Resource name="jdbc/sugarcrm" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/sugarcrm?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
    <Resource name="jdbc/foodmart" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/foodmart?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
    <Manager pathname=""/>
</Context>

I need to add a piece of code before ""

I have the code in a variable as below:

    RESOURCE_BEAN="<Resource name=\"resourceBean\" auth=\"Container\" type=\"javax.sql.DataSource\"
                maxActive=\"100\" maxIdle=\"30\" maxWaitMillis=\"10000\"
                username=\"$username\" password=\"$password\"
                driverClassName=\"$classname\" url=\"$url\"/>"

And I am using the below command to replace but it does not work.

VAR1="<Manager pathname=\"\"/>"

echo "$VAR1"

sed  '/${VAR1}/i ${RESOURCE_BEAN}' context.xml

can someone help me on this.

manjosh
  • 438
  • 6
  • 28
  • 1
    Why not use `xmllint` or `xmlstarlet` to edit XML? – Inian Dec 03 '18 at 05:30
  • 1
    Possible duplicate of [Bash insert subnode to XML file](https://stackoverflow.com/questions/42962889/bash-insert-subnode-to-xml-file) – l0b0 Dec 03 '18 at 05:32
  • Possible duplicate of [Insert multiple lines of text before specific line using Bash](https://stackoverflow.com/q/32007152/608639), [Insert text before a certain line using Bash](https://stackoverflow.com/q/12248784/608639), etc. – jww Dec 03 '18 at 05:46
  • is it possible to achieve this without using xmllint or xmlstartlet? – manjosh Dec 03 '18 at 08:46

1 Answers1

0

Firstly You need to escape also slashes in Your variables:

RESOURCE_BEAN="<Resource name=\"resourceBean\" auth=\"Container\" type=\"javax.sql.DataSource\" maxActive=\"100\" maxIdle=\"30\" maxWaitMillis=\"10000\" username=\"$username\" password=\"$password\" driverClassName=\"$classname\" url=\"$url\"\/>"
VAR1="<Manager pathname=\"\"\/>"

Then this sed should work for You:

sed 's/'"${VAR1}"'/'"${RESOURCE_BEAN}"'/'

Test:

$ cat context.xml
<Context path="/jasperserver-pro" reloadable="false">
    <Resource name="jdbc/jasperserver" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/jasperserver?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
    <Resource name="jdbc/sugarcrm" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/sugarcrm?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
    <Resource name="jdbc/foodmart" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/foodmart?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
    <Manager pathname=""/>
</Context>

$ cat context.xml | sed 's/'"${VAR1}"'/'"${RESOURCE_BEAN}"'/'
    <Context path="/jasperserver-pro" reloadable="false">
        <Resource name="jdbc/jasperserver" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/jasperserver?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
        <Resource name="jdbc/sugarcrm" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/sugarcrm?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
        <Resource name="jdbc/foodmart" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWait="10000" username="jasperdb" password="password" driverClassName="org.postgresql.Driver" accessToUnderlyingConnectionAllowed="true" validationQuery="SELECT 1" testOnBorrow="true" url="jdbc:postgresql://127.0.0.1:5432/foodmart?useUnicode=true&amp;amp;characterEncoding=UTF-8&amp;amp;autoReconnect=true&amp;amp;autoReconnectForPools=true" factory="com.jaspersoft.jasperserver.tomcat.jndi.JSCommonsBasicDataSourceFactory"/>
        <Resource name="resourceBean" auth="Container" type="javax.sql.DataSource" maxActive="100" maxIdle="30" maxWaitMillis="10000" username="" password="" driverClassName="" url=""/>
    </Context>

If You do not want to escape slashes in your variables You must change sed separator to pipes for instance:

sed 's|'"${VAR1}"'|'"${RESOURCE_BEAN}"'|'
Kubator
  • 1,373
  • 4
  • 13
  • echo "resouce bean ==>" RESOURCE_BEAN=" " VAR1="" sed 's/'"${VAR1}"'/'"${RESOURCE_BEAN}"'/' i tried this but i get the error " sed: -e expression #1, char 100: unterminated `s' command" – manjosh Dec 05 '18 at 05:28