2012-09-18 130 views
1

我想替換文件中的一些文本replacetest.xmlbash字符串替換文件

這裏是我想修改的文件的一部分。

<class name="replace_after_this_string">randomtext</class>

我想改變文本randomtext與文本我陣列

orgs=(item1 item2) 

的指數並覆蓋這些修改的文件。

我的主要問題是通配符和sed命令。因此,這裏是我的嘗試

orgs=(item1 item2) 

SRC="name="'"replace_after_this_string"'">" 
#need some sort of wildcard here 


for i in "${orgs[@]}" 
do 
: 
    # do whatever on $i 
    DST=$SRC$i 

    sed -e 's/$SRC/$DST/g' -i replacetest.xml 

done 

1)我需要一個通配符來指定,我想更換randomtext確定將在變量$SRC

2)我的sed語句沒有做任何事情之後什麼除了打印到命令行逐字,根本不修改我的文件,即使在打印到命令行的內容中也是如此

回答

3

我覺得sed是一個錯誤的工具,因爲它不理解XML文件的結構,因此,即使你可以使它工作,你的腳本也會變得非常脆弱。由於Brian Agnew suggests在他的回答中,xmlstarlet是一個用於處理XML文件的有用工具。例如,如果你的文件(12477913.xml,說)如下:

<?xml version="1.0"?> 
<foo> 
    <class name="replace_after_this_string">randomtext</class> 
    <class name="not_for_replacing">some other text</class> 
</foo> 

...那麼這個命令:

xmlstarlet ed -u './/class[@name="replace_after_this_string"]' \ 
    -v 'REPLACED HERE' 12477913.xml 

...會產生以下輸出:

<?xml version="1.0"?> 
<foo> 
    <class name="replace_after_this_string">REPLACED HERE</class> 
    <class name="not_for_replacing">some other text</class> 
</foo> 
2

我知道它並不直接回答你的問題,但我會使用一些能識別XML的方法來修改XML文件。這樣你就可以避免實體和字符編碼問題,並保持良好的格式。

這是值得檢查出XMLStarlet作爲命令行的XML工具包。

+0

我希望你不要介意我按照類似的方法添加答案,但是舉個例子 - 在我看到你的答案時,我已經制定了一個合適的xmlstarlet調用,並且不願放棄它...... –

+0

@MarkLon gair - 根本不是。我已經投了票,因爲一個例子是值得的 –