2

我有一个类似 xml 的文本文件,我想将其解析为一个数组。输入文件看起来像这样

<AA>
  <BB>content 1</BB>
</AA>
<AA>
  <BB>content 2</BB>
</AA>

我希望输出类似于(意味着每个数组元素一个完整的 AA 块):

ARRAY[0]=<AA><BB>content 1</BB></AA>
ARRAY[1]=<AA><BB>content 2</BB></AA>

我试过了

ARRAY=(`cat input.txt | grep -A 3 \<AA\>`)

但这只会为每个数组元素返回一行。有人有想法吗?

4

4 回答 4

3

XML 和 shell 脚本不能很好地混合。如果可以,请考虑使用不同的文件格式或不同的脚本语言。

(
    IFS=$'\n'
    ARRAY=($(grep -A 3 '<AA>' test.xml | awk '{printf "%s",$0} $0~"</AA>" {print}'))

    for MATCH in "${ARRAY[@]}"; do
        echo "$MATCH"
    done
)

解释:

  1. 将 IFS 设置为\n控制数组元素的拆分方式。我们不希望它们在空格或制表符上分开,只是换行。
  2. ARRAY=($(COMMAND))捕获 COMMAND 的输出并将每一行作为一个数组元素(因为我们将 IFS 设置为\n)。
  3. {printf "%s",$0}打印没有尾随换行符的每一行。
  4. $0~"</AA>" {print}每当我们看到结束标签时打印一个换行符</AA>
  5. 整个事情都在括号中以限制$IFS更改的范围。我们不希望这种改变是永久性的;最好将其限制为子外壳。
于 2012-11-19T16:07:17.323 回答
1

If your XML was well-formed, the following example demonstrates how it could be properly parsed using xpath:

#!/bin/bash

XML="
<doc>
<AA>
  <BB>content 1</BB>
</AA>
<AA>
  <BB>content 2</BB>
</AA>
</doc>
"

CONTENT1=`echo $XML | xmllint --xpath "string((/doc/AA/BB)[1])" -`
CONTENT2=`echo $XML | xmllint --xpath "string((/doc/AA/BB)[2])" -`

echo $CONTENT1
echo $CONTENT2
于 2012-11-19T22:22:17.217 回答
1
sed '/^<AA>$/,/^<[/]AA>$/{H;/<[/]AA>/{s:.*::g;x;s:\n::g;s:[ ]*<B:<B:g;b};d}' FILE
于 2012-11-19T16:09:34.690 回答
0

假设<AA></AA>是固定名称,这是一个纯 bash 解决方案

#!/bin/bash
declare -a ARRAY
while read -r line; do
    [ "$line" =~ ^\<BB\>$ ] && ARRAY+=("<AA>$line</AA>")
done < file.xml
于 2012-11-21T07:17:58.270 回答