xmlstarletがインストールされている場合は、次のことを試すことができます。
me@home$ xmlstarlet sel -t -m "//testable" -v trigger -o "|" -v message -o "|" -m sales-info -v san-a -o "|" -v san-b -o "|" -v san-c -n test.xml
Trigger1|2012-06-14T00:03.54|no|no|no
Trigger2|2012-06-15T00:03.54|yes|yes|no
コマンドの内訳:
xmlstarlet sel -t
-m "//testable" # match <testable>
-v trigger -o "|" # print out value of <trigger> followed by |
-v message -o "|" # print out value of <message> followed by |
-m sales-info # match <sales-info>
-v san-a -o "|" # print out value of <san-a> followed by |
-v san-b -o "|" # print out value of <san-b> followed by |
-v san-c # print out value of <san-c>
-n # print new line
test.xml # INPUT XML FILE
内で変化するタグをターゲットにするに<testable>
は、すべてのリーフノードのテキストを返す次のことを試してください。
ma@home$ xmlstarlet sel -t -m "//testable" -m "descendant::*[not(*)]" -v 'text()' -i 'not(position()=last())' -o '|' -b -b -n test.xml
Trigger1|2012-06-14T00:03.54|no|no|no
Trigger2|2012-06-15T00:03.54|yes|yes|no
コマンドのビークダウン:
xmlstarlet sel -t
-m "//testable" # match <testable>
-m "descendant::*[not(*)]" # match all leaf nodes
-v 'text()' # print text
-i 'not(position()=last())' -o '|' # print | if not last item
-b -b # break out of nested matches
-n # print new line
test.xml # INPUT XML FILE
にアクセスできない場合はxmlstarlet
、他に自由に使用できるツールを調べてください。他のオプションには、xsltproc(mzjnの回答を参照)とxpathが含まれます。
これらのツールが利用できない場合は、適切なXMLライブラリにアクセスできる高級言語(Python、Perl)を使用することをお勧めします。
を使用して手動で解析することは可能ですが、特に入力に一貫性regex
がない場合、このようなソリューションは理想的ではありません† 。たとえば、次のように(とがあると仮定してgawk
)sed
入力を受け取り、期待される出力を吐き出す必要があります。
me@home$ gawk 'match($0, />(.*)</, a){printf("%s|",a[1])} /<\/testable>/{print ""}' test.xml | sed 's/.$//'
Trigger1|2012-06-14T00:03.54|no|no|no
Trigger2|2012-06-15T00:03.54|yes|yes|no
ただし、入力形式が変更された場合、これは惨めに失敗するため、一般的に推奨する解決策ではありません。