簡體   English   中英

使用 sed - shell 腳本從 XML 標記中提取文本

[英]Extract text from XML tags using sed - shell script

好吧,我已經編寫了基本上將 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 的命令是基本的,但總是願意 go 加倍努力。

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 最終會導致麻煩。 花時間學習足夠的XSL (有很多教程)來正確轉換 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
#!/bin/sh
filePath=$1 #XML file path
tagName=$2  #Tag name to fetch values
awk '!/<.*>/' RS="<"$tagName">|</"$tagName">" $filePath

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM