0

I 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 <Manager pathname=" "/>.

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

What can I try next?

5
  • 3
    Why not use xmllint or xmlstarlet to edit XML? Commented Dec 3, 2018 at 5:30
  • 2
    Possible duplicate of Bash insert subnode to XML file Commented Dec 3, 2018 at 5:32
  • 1
    Possible duplicate of Insert multiple lines of text before specific line using Bash, Insert text before a certain line using Bash, etc. Commented Dec 3, 2018 at 5:46
  • is it possible to achieve this without using xmllint or xmlstartlet? Commented Dec 3, 2018 at 8:46
  • @manjosh, possible, sure, but a good idea, no. XML-aware tools can be 100% guaranteed to leave your output well-formed; XML-unaware tools categorically cannot -- they don't understand comments, CDATA sections, namespaces, or all the other weirdness that can make characters in an XML file mean different things depending on other contents that aren't directly next to them. Commented Nov 12, 2023 at 22:14

1 Answer 1

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}"'|'
Sign up to request clarification or add additional context in comments.

1 Comment

echo "resouce bean ==>" 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\"\/> <Manager pathname=\"\"\/>" VAR1="<Manager pathname=\"\"\/>" sed 's/'"${VAR1}"'/'"${RESOURCE_BEAN}"'/' i tried this but i get the error " sed: -e expression #1, char 100: unterminated `s' command"

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.