我有一个类似 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
)
说明:
- 将 IFS 设置为
\n
控制数组元素的分割方式。我们不希望它们在空格或制表符上分开,而只是换行。 -
ARRAY=($(COMMAND))
捕获 COMMAND 的输出并将每一行作为数组元素(因为我们将 IFS 设置为\n
)。 -
{printf "%s",$0}
打印每一行,不带尾随换行符。 -
$0~"</AA>" {print}
每当我们看到结束标签</AA>
时就打印换行符. - 整个内容都放在括号中,以限制
$IFS
的范围。改变。我们不希望这种改变是永久性的;最好将其限制为子 shell。
关于xml - Bash:将 XML block 解析为数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13457319/