2017-07-03 86 views
0

我有幾個tomcat服務器,我想通過一些bash腳本動態管理context.xml文件,我想通過使用sed來刪除資源。我知道怎麼做,但該文件的格式如下圖所示在幾個服務器的可讀性起見,我想,我不能確定的資源與此直接刪除:在樹狀行之間的sed刪除

sed '/PATTERN-1/,/PATTERN-2/d' context.xml

但在模式1我需要獲得第二行來將部分name屬性替換爲bash腳本變量。我試了幾種方法作爲逃避\ S或\ n

<Context> 
    ... 
    <Resource 
     name="jdbc/EmployeeDB" auth="Container" 
     type="javax.sql.DataSource" 
     description="Employees Database for HR Applications" 
    /> 
    <Resource 
     name="jdbc/SportDB" auth="Container" 
     type="javax.sql.DataSource" 
     description="Sport Database for HR Applications" 
    /> 
    <Resource 
     name="jdbc/BackupDB" auth="Container" 
     type="javax.sql.DataSource" 
     description="Backup Database for HR Applications" 
    /> 
    ... 
</Context> 
+0

我建議使用XML/HTML解析器(xmlstarlet,xmllint ...)。 – Cyrus

回答

0

我最後做這樣

cat context.xml | sed ':a;N;$!ba;s/<Resource\n/<Resource\ /g;s/ \+/ /gp' | sed -i '/<Resource\ name=\"jdbc\/$2\"/,/\/>/d' 

第一sed接通

<Resource 
     name="jdbc/example" 
     ... 
/> 

<Resource name="jdbc/example" 
     ... 
/> 

條件是i可以與第二sed線之間刪除,因爲我有 「標識符」

0

如果我正確理解你的問題,你可以嘗試以下方法:

sed -ri '/<Resource/,/\/>/ {/name=.*$/d}' filename 

被-R允許正則表達式是解釋和-i直接修改該文件,你會首先之間隔離數據和/>然後刪除與名稱開頭的行=」

+0

我想刪除該部分,而不是編輯。我也已經有腳本來添加新的資源。該部分以'結尾 如果我刪除第一個和最後一個,所有資源都將被刪除。如果我以'name ='database''開頭,資源開放標籤不會被刪除。這就像刪除行1 + 2到10之間的所有內容 – tiagomagalhaes

+0

我修改了刪除而不是修改 –

+0

我想我沒有清楚地解釋自己。儘管如此,我得到了它的工作。你可以檢查我的自動答案。 我只是試圖鏈接兩個sed但沒有成功。 – tiagomagalhaes