2011-04-27 8 views
1

私はすでに基本的にxmlファイルを入力として受け取り、特定のXMLタグのテキストを抽出して動作するスクリプトを作成しています。しかし、複数行のテキストを取得したり、特殊文字を使用することは十分にスマートではありません。テキスト形式はタグの下で定義されているのでそのまま維持することが非常に重要です。sed - shellスクリプトを使って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に割り当てる:

は、以下のXML入力されます。 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 

答えて

3

regexpを使用してXMLを解析すると、経験したとおりに問題が発生します。 xsltprocなどを使用して、XMLを正しく変換するのに十分な数のXSL(多くはtutorials)を習得してください。

編集:

いくつかのコマンドラインの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

@AnderLindahi - うんそれはsedの/はawkを通じて真の解析XMLですこれらのツールは、スマートXML処理のためのものではありませんので、簡単な仕事ではありません。しかし残念なことに、sedを使って** schellスクリプト**を使うことが私の要求です。 – Deminem

+0

@AnserLindahi - [xsltproc](http://linuxcommand.org/man_pages/xsltproc1.html)には、Mac OSXとUnixがあらかじめインストールされていますか? – Deminem

+1

@Deminem:シェルスクリプトを使用する必要があるということは、誰かにドライバを使って木を切る必要があるようなものです。それはすることができますが、それはかなりではありません。 –

0
#!/bin/sh 
filePath=$1 #XML file path 
tagName=$2 #Tag name to fetch values 
awk '!/<.*>/' RS="<"$tagName">|</"$tagName">" $filePath 
+0

RSの定義はかなり変わっています。変数が二重引用符の内部で置換されているので、引用された文字列からそれらを削除する理由はありません。変数名についてもう少し明確にしたい場合は、中括弧で囲むことができます。しかし、正規表現の中に同じ名前のタグを置くことができれば、このコードは失敗します。 – danfuzz

関連する問題