在两个非静态字符串之间打印文本

Print text between two non-static strings

我想自动执行解析 XML 文件并复制其中一部分的脚本。 我搜索并 found a way to do that 但它只适用于像

这样的字段
<title> .... </title>

我的目的是复制这个

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true">
    THINGS AND FIELDS IN HERE
</datasource>

并将其粘贴到 </datasource> 之后。然后我将使用 sed 更改值。但我基本上想把那个部分加倍。

我只是不知道该怎么做,也许这是一个 XY 问题。有帮助吗?

示例:

我有

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true">
THINGS AND FIELDS IN HERE

我想要

<datasource enabled="true" jndi-name="java:/db_namePostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true">
    THINGS AND FIELDS IN HERE
</datasource>

<datasource enabled="true" jndi-name="java:/MODIFIED_NAME_HERE_PostgresDS" jta="true" pool-name="db_namePostgresDS" spy="false" use-ccm="false" use-java-context="true">
    MODIFIED THINGS AND FIELDS IN HERE
</datasource>

重要提示:我需要避免在机器上安装新软件(明确的客户要求)。 XML 解析器,即使不是内置的,也不是办法。

我会使用 sed 来提取多行 xml 标签:

orig_datasource=$(sed -n '/<datasource/{: l;N;/<\/datasource>/!bl;p}' your_input_file)

此命令在遇到起始 <datasource 标记后开始聚合行,并在聚合到结束 </datasource> 标记后打印结果。 *

XML 标签将被捕获在一个 orig_datasource 变量中,然后我可以按原样使用和修改它:

modified_datasource=$(echo "$orig_datasource" | sed 's/something/else/');
echo "$orig_datasource

$modified_datasource" > target_file

* :有很多方法可能会失败(即 < datasource> 是一个有效的标签开头, sed 命令不会这样理解),但是因为它看起来就像您正在处理来自 JBoss EAP 或 Wildfly 的配置文件一样,您应该是安全的,因为这些工具在启动时会重新格式化其配置文件。 不过,尽可能使用 XML 解析器比将数据解析为文本更安全、更容易。