我有一个类似这样的文件
<?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>
答案 0 :(得分:2)
将grep
与xml
一起使用通常不是一个好主意。建议在这种情况下使用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>