我已经编写了脚本,它基本上将xml文件作为输入,并提取特定XML标记的文本,并且它正在工作。但是,获取多行文本并允许使用特殊字符并不够智能。非常重要的是,文本格式应保持完整,因为它是在标签下定义的。
以下是XML输入:
<nick>Deminem</nick>
<company>XYZ Solutions</company>
<description>
/**
*
* «Lorem» ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy
* tempor invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua.
* At vero eos et accusam et justo duo dolores et ea rebum. Stet clita kasd
* no sea takimata sanctus est Lorem ipsum dolor sit amet. Lorem ipsum dolor sit
* consetetur sadipscing elitr, sed diam nonumy eirmod tempor invidunt ut labore
* magna aliquyam erat, sed diam voluptua.
*
**/
</description>
上面的脚本提取每个特定标记的文本并分配给新的valueArray。我对sed的命令是基本的,但总是愿意加倍努力。
tagsArray=( nick company description )
noOfElements=${#tagsArray[@]}
for (( i=0;i<$noOfElements;i++)); do
OUT=`grep ${tagsArray[${i}]} filename.xml | tr -d '\t' | sed -e 's/^<.*>\([^<].*\)<.*>$/\1/' `
valueArray[${i}]=${OUT}
done
答案 0 :(得分:3)
使用regexp解析XML最终会导致麻烦,就像您经历过的那样。花点时间学习XSL(有很多tutorials)来正确转换XML,例如使用xsltproc。
修改强>
在尝试了几个命令行xml实用程序后,我认为xmlstarlet可能是您的工具。以下是未经测试的,并假设filename.xml
是一个正确的xml文件(即具有单个根元素)。
tagsArray=( nick company description )
noOfElements=${#tagsArray[@]}
for (( i=0;i<$noOfElements;i++)); do
valueArray[${i}] = `xmlstarlet sel -t -v "/root/$tagsArray[i]" filename.xml`
done
答案 1 :(得分:0)
#!/bin/sh
filePath=$1 #XML file path
tagName=$2 #Tag name to fetch values
awk '!/<.*>/' RS="<"$tagName">|</"$tagName">" $filePath