将grep结果保存到变量时,grep结果用空格分隔

时间:2018-04-10 07:53:52

标签: bash shell

需要你的帮助。我有一个简单的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结果保存到变量时,只要有空格,它就会以某种方式分开。想知道是否有人可以帮助我,提前谢谢你。

2 个答案:

答案 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