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>
到文件末尾 ($)。