2014-07-02 47 views
0

我想找到並更換VALUE成xml文件替換:查找和文件與腳本

<test name="NAME" value="VALUE"/> 

我的名字來過濾(因爲有很多這樣的線)。

可能嗎?

感謝您的幫助。

+0

您是否想用VALUE取代VALUE? –

+0

'sed -i'〜VALUE〜foo〜g'文件。xml' –

+0

值是一個隨機值,例如我設置了VALUE,但它是一個字符串,並且必須由其他字符串替換。 –

回答

1

由於您標記了「bash」這個問題,我假定您並未試圖使用XML庫(儘管我認爲XML專家可能會給您類似於XSLT處理器命令的東西,可以很好地解決此問題強大),但你只是在做搜索&替換命令行感興趣。

我用perl此:

perl -pi -e 's#VALUE#replacement#g' *.xml 

perlrun手冊頁:很快的說,-p開關的Perl成文字處理模式,-i代表「就地」,並-e使你可以指定一個適用於所有輸入行的表達式。

還要注意(如果你不是太熟悉的話),你可以使用其它字符比#(常見的有%,逗號等),不與你的搜索&替換字符串衝突。

有一個小告誡:perl的將讀取&寫在命令行給出的所有文件,甚至是那些沒有改變。因此,文件'修改時間即使沒有更改也會更新。 (我通常用一些更多的shell魔法來解決這個問題,例如使用grep -lgrin -l來選擇perl文件。

編輯:如果我正確理解你的評論,還需要幫助使用正則表達式來應用。請允許我簡要建議是這樣的,那麼:

perl -pi -e 's,(name="NAME" value=)"[^"]*",\1"NEWVALUE",g' *.xml 
+0

我不知道VALUE,它是一個字符串,在我的帖子中用「VALUE」取代。而且,我必須按名稱過濾。 –

+0

如果你知道name =總是在value =之前出現,那麼只需要在上面的命令中擴展正則表達式即可。如果你不這樣做,我會用「xml」來標記問題,並使用適當的XML工具來完成這項工作。 –

+0

是的名字總是在值之前出現;) –

1

相關:bash XHTML parsing using xpath

您可以使用SED

SED 's/\(<test name=\"NAME\"\) value=\"VALUE\"/\1 value=\"YourValue\"/' test.xml 

其中的test.xml是包含給定節點的XML文檔。這非常脆弱,如果您需要多次進行替換,您可以努力使其更加靈活。例如,當前語句區分大小寫,因此它不會替換name =「name」節點上的值,但可以在語句末尾添加不區分大小寫的標誌,如下所示:

('s/\(<test name=\"NAME\"\) value=\"VALUE\"/\1 value=\"YourValue\"/I')

另一個選擇是使用XSLT,但它會要求你下載一個外部庫。它非常靈活,對於更復雜的XML文檔修改可能是一個可行的選擇。