【问题标题】:Extract text from XML tags using sed - shell script使用 sed - shell 脚本从 XML 标记中提取文本
【发布时间】:2011-08-14 02:57:40
【问题描述】:

好吧,我已经编写了基本上以 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 

【问题讨论】:

    标签: xml macos shell sed


    【解决方案1】:
    #!/bin/sh
    filePath=$1 #XML file path
    tagName=$2  #Tag name to fetch values
    awk '!/<.*>/' RS="<"$tagName">|</"$tagName">" $filePath
    

    【讨论】:

    • RS 定义非常古怪,因为变量在双引号内被替换,因此没有理由将它们排除在引号字符串之外。如果您想更明确地了解变量名称,您可以始终将它们放在花括号中,例如RS="&lt;${tagName}&gt;|&lt;/${tagName}&gt;'。但除此之外,正则表达式不足以解析 XML,因为它可以嵌套。例如,如果您可以在其内部拥有同名标签,则此代码将失败。
    【解决方案2】:

    正如您所经历的那样,使用正则表达式解析 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
    

    【讨论】:

    • @AnderLindahi - 是的,通过 sed/awk 解析 XML 确实不是一件容易的工作,因为这些工具不适用于智能 XML 处理。但不幸的是,我要求使用 sed 坚持使用 schell 脚本
    • @AnserLindahi - xsltproc 是 Mac OSX 和 Unix 的预安装包吗?
    • @Deminem:要求使用 shell 脚本就像要求有人用螺丝刀砍树一样。可以做但是不好看。
    • @Jim:在我的场景中,要求使用 shell 脚本很重要,因为不希望依赖安装任何第三方工具来安装一些自定义模板 这可以通过 shell 脚本轻松完成。唯一的结果是读取 XML 格式的配置设置。如果您有更好的建议来用相同的 对替换我的配置设置数据格式,请告诉我。
    • Deminem:如何存储配置取决于您吗?只有你的 shell 脚本会读取它吗?
    猜你喜欢
    • 2016-10-08
    • 2013-10-17
    • 2021-01-25
    • 2014-11-13
    • 2021-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多