我想自动化一个解析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解析器,如果不是内置的,则不是这样。
答案 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解析器比将数据解析为文本更安全,更容易。