需要你的帮助。我有一个简单的XML文件:
<Entity ID="12345" Record="1">
<Info>
<Type>Individual</Type>
<Name>Test</Name>
</Info>
<Entity Record="2">
<Info>
<Type>Individual</Type>
<Name>Test2</Name>
</Info>
我想要做的是grep节点的属性及其值。
这是我的代码:
entities=($(grep -oP '(?<=<Entity ).*(?=>)' "abc.xml"))
for j in ${!entities[*]}
do
echo "${entities[$j]}"
((count++))
done
echo "Total Count: $count"
输出继电器:
ID="12345"
Record="1"
Record="2"
Total Count: 3
但是,我想要的结果应该是:
ID="12345" Record="1"
Record="2"
Total Count: 2
当我将grep结果保存到变量时,只要有空格,它就会以某种方式分开。想知道是否有人可以帮助我,提前谢谢你。
答案 0 :(得分:1)
我强烈建议使用XML解析器,例如,您可以使用xmlstarlet
现在假设这是您有效的XML文件:
<?xml version="1.0" encoding="utf-8"?>
<foo>
<Entity ID="12345" Record="1">
<Info>
<Type>Individual</Type>
<Name>Test</Name>
</Info>
</Entity>
<Entity ID="123456" Record="1">
<Info>
<Type>Individual</Type>
<Name>Test</Name>
</Info>
</Entity>
</foo>
要提取要启动的字段,可以是:
xmlstarlet sel -T -t -m //Entity -o ID= -v "@ID" -o " Redcord=" -v "@Record" -n your.xml
这将打印:
ID=12345 Redcord=1
ID=123456 Redcord=1
计算元素数量:
xmlstarlet sel -t -c "count(//Entity)" your.xml
这些只是基础知识,但希望它可以帮助您获得一个想法。
答案 1 :(得分:0)
你的IFS错了:
#!/bin/bash
ifs_ini="$IFS"
IFS=$'\n'
entities=( $(grep -oP '(?<=<Entity ).*(?=>)' "abc.xml") )
for j in ${!entities[@]}; do
echo "${entities[$j]}"
((count++))
done
echo "Total Count: $count"
IFS="$ifs_ini"
输出:
ID="12345" Record="1"
Record="2"
Total Count: 2