【问题标题】:How to add block of code within a file?如何在文件中添加代码块?
【发布时间】:2015-01-31 01:08:24
【问题描述】:

我在一些设置文件中有这个设置:

<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>

sed我只用过简单的东西,但我不知道如何正确使用它,因为我不想替换任何文本,只需在里面添加代码块另一个。有什么想法或建议吗?

【问题讨论】:

  • 不要使用 sed 进行 XML 处理。使用 xml 工具。就像 XSLT 或 xmlstarlet 或带有 xml 库的编程语言。
  • 也许使用awk 或XSLT
  • @EtanReisner,我明白了。我当时正在考虑使用shell,但python 应该更合适。
  • 有一些工具,如 xmlstarlet 和 XMLgawk,用于在 shell 中与 XML 交互。这种情况具体可以用 sed 或 awk 完成,但更复杂的情况则不能。
  • 看看这个,你需要类似的东西 - stackoverflow.com/questions/3649195/…

标签: linux text sed


【解决方案1】:

使用sed,您可以使用r command 进行如下操作:

  • 如果文件中有代码块(名为validation):

    sed "14r validation" standalone.xml
    
  • 如果你有它在一个变量($validation):

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

在第一种方法中,sed 只是插入文件validation

在第二个中,我们必须从$validation 中的数据创建一个文件。
实现此目的的一种方法是使用 bash 的 Here Strings我注意到您在自己的答案中使用了 bash)和 Process Substitution
通过cat &lt;&lt;&lt;"$validation",我们将$validation 扩展为cat 的标准输入。

【讨论】:

    【解决方案2】:

    这是我迄今为止开发的。我担心这是否是一种智能方法。 因为对我来说,它看起来并不优雅:(

    #!/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
    

    【讨论】:

      【解决方案3】:

      您需要多久执行一次? (即,该验证是否会不断启用/禁用?)。

      git 怎么样?只需使用源代码控制系统,您就可以拥有一个带有额外块的文件版本和另一个没有额外块的文件。

      只是一个想法。

      【讨论】:

      • 您好马塞洛,感谢您的建议。我不知道这是否是一个好主意,因为可能需要添加其他配置,并且为每种情况都这样做可能会带来一些麻烦。
      • 没问题,只是弹跳想法,感谢您不投反对票。那么,在这种情况下.. 为什么不参数化并使用 git?例如,....另外,跳出框框思考:为什么需要删除块如果你可以隐藏它? :) 例如, 或
      猜你喜欢
      • 2016-09-19
      • 2019-01-29
      • 2016-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多