如何使用unix删除xml中模式之前的内容

如何使用unix删除xml中模式之前的内容
Source file example:
<HDR></HDR><b></b><c></c>

(在一行中创建的 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>到文件末尾 ($)。

相关内容