2017-09-25 77 views
0

我想自动化解析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解析器(如果不是内置的话)不是这样。

+2

使用xml解析器 – 123

+0

我应该指定它,我会修改帖子...必须避免在机器上安装软件(客户请求) –

+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解析器更安全和更容易。

+0

实际上,该命令只是将整个文件存储在$ orig_datasource ... (是的,我使用的是Wildfly8.1) –

+0

@WyattGillette我修复了sed命令中的一个错误,你可以再试一次吗? – Aaron

+0

是的,这几乎工作!它也发现了重复,所以我将不得不找到一种方法,在第一轮比赛结束后停止......最好的办法是什么?......但这是一个巨大的进步! (只是为了了解...错误是什么?) 编辑:这么简单,'p'后添加'q':) Upvote授予和thnx很多! –

相关问题