使用sed-shell脚本从XML标记中提取文本

时间:2011-04-27 18:55:55

标签: xml macos shell sed

我已经编写了脚本,它基本上将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 

2 个答案:

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