1

我有一个 XML 格式的文件:

...
<element1>
<element2>
<group1>
<tag1>value</tag1>
<tag2>value</tag2>
</group1>
<group1>
<tag1>value</tag1>
<tag2>value</tag2>
</group1>
<element2>
...

我用了

sed -n '/\<group1\>/,\<\/group1>/p' filename

提取 group1 标记的所有内容,包括所有子项。这正是我想要的。

<group1>
<tag1>value</tag1>
<tag2>value</tag2>
</group1>
<group1>
<tag1>value</tag1>
<tag2>value</tag2>
</group1>

但是,如果输入 XML 的格式为

...
<element1>
<element2>
<group2>
     <group2>value</group2>
     <otherTag>value</otherTag>
</group2>
<element3>
<group2>
     <group2>value</group2>
     <otherTag>value</otherTag>
</group2>
...

我试图提取以下内容

<group2>
     <group2>value</group2>
     <otherTag>value</otherTag>
</group2>
<group2>
     <group2>value</group2>
     <otherTag>value</otherTag>
</group2>

上面的 sed 命令只返回:

<group2>
     <group2>value</group2>

它理解停止模式</group2>并且不再进行提取。我在这里很困惑。为什么不继续提取下一个<group2><group1>以防万一。有没有办法让它与 sed 一起工作?还有其他选择吗?

4

3 回答 3

1

你可以sed像这样改变你的

sed -n '/\<group1\>/,/^<\/group1>/p' filename  | grep -v 'element3'
于 2013-10-09T17:34:16.773 回答
1

将 XPath 与命令行 xpath 解释器一起使用要好得多,例如 xpath、xmlstarlet、my xidel 或 xmllint。

第 3 层的所有组元素:

/elememt1/*/group1

不包含 group2 的所有组元素:

//group2[not(group2)]
于 2013-10-09T21:18:36.770 回答
0

有的这样?

awk '/^<group2>/,/^<\/group2>/' file
<group2>
     <group2>value</group2>
     <otherTag>value</otherTag>
</group2>
<group2>
     <group2>value</group2>
     <otherTag>value</otherTag>
</group2>

如果标签上有不同的间距,这有效,如果全部调整到左侧,它将不起作用

于 2013-10-09T17:35:41.030 回答