簡體   English   中英

Bash在變量上使用Sed

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM