如何从键上匹配模式的xml文件中提取属性

时间:2016-12-09 01:10:09

标签: xml bash shell sed

我有一个类似这样的文件

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<property><name>key1.somestuff.someotherstuff</name><value>value1</value></property><property><name>key2.somestuff.someotherstuff</name><value>value2</value></property></configuration>

因此我输入的文件格式不正确,我需要将一些与模式匹配的属性复制到另一个xml文件中。 如何在shell中为此文件提取段(使用grep或sed或任何此类工具)以获取键中的给定模式。 例如,如果代码格式正确,我可以使用:

grep --no-group-separator -a2 "key1"

如何为某个键提取段,例如key1:

<property>
  <name>key1.somestuff.someotherstuff</name>
  <value>value1</value>
</property>

1 个答案:

答案 0 :(得分:2)

grepxml一起使用通常不是一个好主意。建议在这种情况下使用xmllint之类的XML感知工具。链接中提供了下载和安装说明。

使用xmllint一个简单的xpath解析器逻辑,如下所示

xmllint --xpath '/configuration/property[contains(name,"key1.somestuff.someotherstuff")]' input-xml

应该解决你的情况。逻辑很简单。从根节点configuration开始到property并获取节点name值,前提是它包含您需要的字符串。

由于描述中的文件格式为平线,因此上述命令会生成平面输出,如:

xmllint --xpath '/configuration/property[contains(name,"key1.somestuff.someotherstuff")]' input-xml
<property><name>key1.somestuff.someotherstuff</name><value>value1</value></property>

假设我将输入文件修改为适当的XML结构:

$ cat modified-xml
<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
    <property>
        <name>key1.somestuff.someotherstuff</name>
        <value>value1</value>
    </property>
    <property>
        <name>key2.somestuff.someotherstuff</name>
        <value>value2</value>
    </property>
</configuration>

输出如下内容: -

<property>
        <name>key1.somestuff.someotherstuff</name>
        <value>value1</value>
    </property>