2016-04-15 111 views
0

我有一個XML文件,該文件將永遠有它裏面以下塊使用桑達:猛砸一個變量

<Name NameType="Also Known As"> 
    <NameValue> 
    <FirstName>name1</FirstName> 
    <Surname>sur1</Surname> 
    </NameValue> 
    <NameValue> 
    <FirstName>name2</FirstName> 
    <Surname>sur2</Surname> 
    </NameValue> 
</Name> 

有可能只是一個「NameValue」這個區塊內的節點或可能有很多。我的問題是,我只想保留第一個並丟棄其餘的。因此上面的例子會讀取:

<Name NameType="Also Known As"> 
    <NameValue> 
    <FirstName>name1</FirstName> 
    <Surname>sur1</Surname> 
    </NameValue> 
</Name> 

我想使用sed來達到此目的。我已經寫了上面的塊給一個變量,並試圖以操縱如下:

var=$(sed -n '/<Name NameType="Also Known As">*/,/<\/Name>/p' $file) 
sed -i 's/<\/NameValue>.*<\/Name>/<\/NameValue><\/Name>/g' "$var" 

我得到的回報如下:

sed: can't read <Name NameType="Also Known As">... 

我認爲第一閉合之間的上述會取代一切NameValue標籤和沒有任何東西的關閉Name標籤。我使用-i選項,因爲我想將更改保存到此文件。也許它是語法相關的,或者我對變量使用sed命令的理解還沒有結束。需要注意的一點是,這些標籤出現在文件中的其他節點內,因此使用sed執行一次全局更新會更改我不想更改的塊。這是我將這個塊傳遞給一個變量的原因。任何指針在正確的方向將不勝感激。

+4

sed的文件和流(流編輯器),不變量進行操作。把你的變量內容放入其中。 –

+2

那麼你也可以說'sed'...東西...'<<<「$ var」'。 – fedorqui

+0

謝謝@Ignacio。我已經採取了你的建議,並將該變量的內容輸出到一個文件中,我可以輕鬆地進行我需要的字符串操作。然後我可以用這個新文件的內容替換原始文件中的那個塊(或者至少這是我目前正在嘗試做的)。我深知,這是不乾淨的解決方案,並可能隨時間和使用shell命令更多的經驗,我會避免這種類型的方法,但現在我只是一些作品後很。再次感謝您花時間回覆。 – tasslebear

回答

1

正如先前的評論指出,sed預計一個或多個輸入文件(可能是像標準輸入,當然)。在你的示例代碼,可以讀取文件的內容一個變量在一種迂迴的方式,然後使用該變量作爲名的文件的。這肯定會失敗。雖然我確信您可以使用sed實現您的目標,但我不建議。在sed分支是可怕的。使用更強大的工具,最好是xsltproc或其他設計用於處理XML的工具。

您可以使用類似如下的樣式表:

<?xml version="1.0" encoding="ISO-8859-1"?> 
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
    <xsl:template match="/Name"> 
    <Name> 
    <xsl:copy-of select="@*" /> 
    <xsl:copy-of select="*[1]" /> 
    </Name> 
    </xsl:template> 
</xsl:stylesheet> 
+0

感謝Michael的迴應。你說的對,使用sed對於這個目的來說很麻煩,但是正如它發生的那樣,我幾乎有一些東西在一起,我認爲它們可能會用更多的推文。這種特殊的XML沒有關聯的XSL文件(至少我是從來沒有提供一個...只有一個XSD),所以我不知道在xsltproc將任何使用我的。無論如何,我從未使用過它。無論如何,我會繼續努力,並感謝您花時間做出迴應。 – tasslebear

+0

我已經接受了這個答案,因爲你花時間提供一個樣式表,我可以用這個問題的一個例子。事後看來,我原來的問題應該是「如何從xml創建xsl文件」文件。非常感謝。 – tasslebear