[英]Bash Using Sed on a Variable
我有一個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進行一次全局更新將更改我不想更改的塊。 這就是我將此塊傳遞給變量的原因。 任何朝着正確方向的指針將不勝感激。
正如前面的評論所指出的那樣, sed
需要一個或幾個輸入文件(當然,它可能像stdin一樣)。 在你的示例代碼,可以讀取文件的內容轉換成以一種迂回的方式變量,然后使用該變量作為文件名 。 那注定會失敗的。 雖然我確定您可以使用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>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.