2014-01-15 68 views
-1

我一直在嘗試編寫一個sed命令來替換單個單詞上的單個單詞,保留所有前導空格和單詞。保留前導空格的Sed替換

例如 來源:

<Attr name="x" value="yes"/> 

要:

<Attr name="x" value="no"/> 

我知道,我可能只是重寫整個行,但我更喜歡一個更優雅的方式來做到這一點。 謝謝!

+1

你從哪兒弄來stucked:爲Attr節點,其中name是「x」和value是「是」,你可以使用像xmlstarlet工具更換價值? – fedorqui

+1

'sed'不接觸空白,除非你告訴它。你是怎麼試着沒有給你正確結果的'sed'? – Shahbaz

回答

1

You can't parse XML with regexes。使用XML處理工具。

echo '<doc> 
    <Attr name="x" value="yes"/> 
    <Attr name="y" value="yes"/> 
    <Attr name="x" value="maybe"/> 
</doc>' | 
xmlstarlet ed -u '//Attr[@name="x"][@value="yes"]/@value' -v "no" 
<?xml version="1.0"?> 
<doc> 
    <Attr name="x" value="no"/> 
    <Attr name="y" value="yes"/> 
    <Attr name="x" value="maybe"/> 
</doc> 
+0

我還沒有嘗試過,但它似乎是最好的解決方案和最靈活的!非常感謝你!!! –

4

我想如果沒有加入更明確的要求,這個簡單的解決方案應該是罰款:

sed 's/"yes"/"no"/' 
+0

你可能想把它改成's /「yes」/「no」'或's/\ /no',所以你不會意外改變其他的東西。 – Shahbaz

+0

非常感謝您的回答!但我認爲這不是一個有效的解決方案,因爲(我的錯我沒有解釋它)該文件包含多個條目,您的解決方案將更改整個文件。 –

+0

您可以在s之前添加目標行號。 –

0

約什的解決方案將改寫字的許多OCCURENCES文件 - 這可能不是你想要的。

下面的sed調用將只在3號線替代的 「是」 第一次出現爲 「無」 裏面file.xml:

sed -i 3s/yes/no/ file.xml