2017-09-25 49 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很多! –

相關問題