Unixを使用してXMLからパターンの前の内容を削除する方法

Unixを使用してXMLからパターンの前の内容を削除する方法
Source file example:
<HDR></HDR><b></b><c></c>

(1行で生成されたXMLファイル)

または

Source file example:
<HDR>
</HDR>
<b>
</b>
<c>
</c>

<b>両方のソース形式から古いファイルのすべての内容を削除する必要があります。私は次の方法を試しました。

sed 's/^.*b/b/'

しかし、それはそれを置き換えることはありません。他の方法があれば教えてください。

答え1

XML文書が次のようによく構成されているとします。

<document>
<HDR>
</HDR>
<b>
</b>
<c>
</c>
</document>

それからあなたは利用可能ですXMLスターHDR以下のようにすべてのタグを削除してください。

xmlstarlet ed -d '//HDR' file.xml >newfile.xml

タグHDRの直後にあるタグのみを削除します。b

xmlstarlet ed -d '//HDR[following-sibling::*[1][name() = "b"]]' file.xml >newfile.xml

XMLStarlet を使用してタグの内容を変更することもできます。

$ xmlstarlet ed -u '//HDR[following-sibling::*[1][name() = "b"]]' -v 'New header value' file.xml
<?xml version="1.0"?>
<document>
  <HDR>New header value</HDR>
  <b/>
  <c/>
</document>

$ xmlstarlet ed -i '//HDR[following-sibling::*[1][name() = "b"]]' -t attr -n 'new_attribute' -v 'hello' file.xml
<?xml version="1.0"?>
<document>
  <HDR new_attribute="hello"/>
  <b/>
  <c/>
</document>

答え2

質問:

古いファイルのすべての内容を削除<b>

答え:

perl -0777 -lape 's/^.*<b>/<b>/s'

テスト実行:

==> in1.txt <==
<HDR></HDR><b></b><c></c>

==> in2.txt <==
<HDR>
</HDR>
<b>
</b>
<c>
</c>

$ perl -i -0777 -lape 's/^.*<b>/<b>/s' in{1,2}.txt

==> in1.txt <==
<b></b><c></c>

==> in2.txt <==
<b>
</b>
<c>
</c>

答え3

タイプ1:

 echo "<HDR></HDR><b></b><c></c>" | sed 's/^.*<b>/<b>/' 
 <b></b><c></c>
  • <b>すべてを置き換える<b>

タイプ2:

sed  -n '/<b>/,$p' file
<b>
</b>
<c>
</c>
  • <b>ファイルの終わり($)に最初の項目を印刷します。

関連情報