使用sed获取XML中第n次出现的标记的TagValue
我的xml使用sed获取XML中第n次出现的标记的TagValue,sed,Sed,我的xml 123 959595 1233 季吉 我需要使用sed获取属性标记第二次出现的标记值,即9595 我使用了命令 <?xml version="1.0" encoding="UTF-8" ?> <Attributes> <Attribute>123</Attribute> <Attribute>959595</Attribute> <Attribute>1233</Attri
123
959595
1233
季吉
我需要使用sed获取属性标记第二次出现的标记值,即9595
我使用了命令
<?xml version="1.0" encoding="UTF-8" ?>
<Attributes>
<Attribute>123</Attribute>
<Attribute>959595</Attribute>
<Attribute>1233</Attribute>
<Attribute>jiji</Attribute>
</Attributes>
sed-n:a;$!{N;ba};正确的方法是:
sed -n ':a;$!{N;ba};s#\(<Attribute\)\(.*\)\(</Attribute>\)#\1#2#\2#p' file
笔记
xmllint
附带libxml2
- “2”是第二个搜索的元素
sed-n'//,\ \{
// {
H、 g
s.*\(.\).*\1#
找不到
}
B
:找到
p、 q
}“你的档案
- 假设像在示例中一样,只需要找到1个属性,此sed只返回第一个属性。(如果xml内容与示例类似,则不需要选择
/,\\\\\\
)
- Posix版本so
——GNU上的Posix
此sed打印属性块中的所有属性条目,然后获取第二个条目并删除标记:
sed-n'/,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
sed -n '/<Attributes>/,\#</Attributes># {
/<Attribute>/ {
H;g
s#.*<Attribute>\(.*\)</Attribute>.*#\1#
t found
}
b
:found
p;q
}' YourFile
或者另一种不使用管道的方法是使用sed命令,这将转到第二个条目,去掉属性标记,然后退出:
sed-n'//,\\\\\\\\{/{n;s\\.*(.*).*.\\\1#p;q}attrib.txt
或者,如果属性条目的数量发生变化,您可以通过解析所有值,然后使用sed在需要的位置打印属性位置,使其更加直观:
sed-n'//,\\\\\\\\\\\\\/{s\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\
您可以将结束位置从2更改为要显示的任何属性值字段,或采用多个值,如sed-n'2p;3p'
或sed-n'1,2p'
我也将采用xmllint xpath方式。不过,似乎有两个版本可用。根据该手册页上的内容,没有xpath参数,但它被称为“模式”
根据此文档,您的呼叫将是
Output:
959595
我建议检查您的本地手册页,看看要使用哪一个。我更愿意使用支持XML的命令行工具-例如,如果您在上面加上一个n,您将得到下一个条目(我认为这是OP想要的):sed-n'/,\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ 1\\\\\\\\\\\\}b:发现p;q}'attrib.txt不相同。n
将无条件地将下一行添加到工作缓冲区(除非最后一行)这可能不是什么,这就是为什么我过滤并使用holding Buffer我在我的系统上测试了它,它可以工作。您已经为语句打开了/Attribute/addressing,所以您可能不需要太多其他东西。使用123
或简单地使用1
内容进行测试(所有标记之间都有新行)我使用了OP中的测试数据,他想要的是第二个属性条目,而不是第一个。
Output:
959595
$ xmllint --pattern '/Attributes/Attribute[2]/text()' file.xml