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

时间:2017-09-25 12:53:47

标签: xml bash parsing centos7

我想自动化一个解析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解析器,如果不是内置的,则不是这样。

1 个答案:

答案 0 :(得分:1)

我会使用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解析器比将数据解析为文本更安全,更容易。