2014-12-02 2 views
1

Я имею эту установку в какой-то файл настройки:Как добавить блок кода в файл?

<datasource jndi-name="java:jboss/datasources/DS" pool-name="mysqlDS"> 
    <connection-url>jdbc:mysql://localhost:3306/DSDB</connection-url> 
    <driver>mysqlDriver</driver> 
    <pool> 
     <min-pool-size>10</min-pool-size> 
     <max-pool-size>200</max-pool-size> 
     <prefill>true</prefill> 
     <use-strict-min>false</use-strict-min> 
     <flush-strategy>FailingConnectionOnly</flush-strategy> 
    </pool> 
    <security> 
     <security-domain>csa-encryption-sec</security-domain> 
    </security> 
    #block of code needs to be inserted HERE 
</datasource> 

И это блок кода, который должен быть вставлен:

<validation> 
    <check-valid-connection-sql>SELECT 1</check-valid-connection-sql> 
    <background-validation>true</background-validation> 
    <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"></valid-connection-checker> 
    <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"></exception-sorter> 
</validation> 

Я только использовал СЭД с простейших вещей, но Я не знаю, как правильно использовать его, потому что я не хочу заменять текст, просто добавьте блок кода внутри другого. Любая идея или предложения?

+1

Не используйте sed для обработки XML. Используйте инструмент xml. Как XSLT или xmlstarlet или язык программирования с библиотекой xml. –

+0

Возможно, используйте 'awk' или XSLT –

+0

@ EtanReisner, я вижу. Я думал об использовании 'shell' для этого, но тогда' python' должен быть более присвоен. –

ответ

1

с sed, вы можете сделать он с r command следующим образом:

  • Если у вас есть блок кода в файле (с именем проверки):

    sed "14r validation" standalone.xml 
    
  • Если у вас есть в переменной ($validation):

    sed "14r"<(cat <<<"$validation") file 
    

В первом методе sed просто вставляет файл validation.

Во втором случае мы должны сделать файл из данных в $validation.
Способ достижения этого - использовать bash's Here Strings (Я заметил, что вы используете bash в своем ответе) и Process Substitution.
С cat <<<"$validation" мы поставляем расширение $validation на стандартный входной сигнал cat.

0

Это то, что я разработал до сих пор. Я беспокоюсь, если это разумный подход. Потому что для меня это не выглядит элегантно :(

#!/bin/bash 

validation='\<validation\> \ 
    \<check-valid-connection-sql\>SELECT 1\<\/check-valid-connection-sql\> \ 
    \<background-validation\>true\<\/background-validation\> \ 
    \<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLValidConnectionChecker"\>\<\/valid-connection-checker\> \ 
    \<exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.mysql.MySQLExceptionSorter"\>\<\/exception-sorter\> \ 
\<\/validation\>' 

sed -i "15i $validation" standalone.xml 
0

как часто вам нужно сделать это? (То есть, в том, что проверки что-то, что включено/отключено постоянно?).

Как о мерзавце? Просто используйте систему источника управления, то вы можете иметь версию файла с дополнительным блоком и еще один без дополнительного блока.

Просто идея.

+0

Привет, Марсело, спасибо за предложение. Я не знаю, была бы хорошая идея, потому что может потребоваться добавление другой конфигурации, и выполнение этого для каждого случая может вызвать некоторые проблемы. –

+0

не проблема, просто подпрыгивающие идеи, спасибо за то, что вы не спаслись. Итак, в этом случае .. почему не параметризировать и использовать git? например, .... также, думая вне коробки: зачем вам нужно удалить блок если вы можете просто скрыть это? :), например, или theMarceloR

Смежные вопросы