xml - Bash:将 XML block 解析为数组

标签 xml arrays bash parsing

我有一个类似 xml 的文本文件,我想将其解析为数组。输入文件如下所示

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

我希望输出如下(意味着每个数组元素有一个完整的 AA block ):

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

我试过了

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

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

最佳答案

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 的范围。改变。我们不希望这种改变是永久性的;最好将其限制为子 shell。

关于xml - Bash:将 XML block 解析为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457319/

相关文章:

java - 创建一个出现在两个给定数组java中的值数组

linux - 在 Linux bash 中模拟 ENTER 键并一起导出另一个变量

linux - 从 bash 中的字符串位置剪切字符

javascript - 将数字数组拆分为总和小于或等于给定数字的数组

bash - 如何在 bash 中将包含空格的变量作为循环参数传递?

java - 使用 JDK 1.4.x 引用 xml 模式

c++ - 迭代 C++ std::map 的正确方法不起作用

android - XML 文件中的错误使 R 无法工作

java - 如何用Java获取XML中的最后一个属性?

PHP - 当给定子键名称时,递归地将每个数组元素的键设置为子元素的值