0

このxmlの例から取得しようとしています

<String Name="descResist">
    <Description><![CDATA["resist_type_chimney"]]></Description>
    <Flags>
        <ParFlg_Child/>
    </Flags>
    <Value><![CDATA["90_min."]]></Value>
</String>

これ

descResist;resist_type_chimney 
descResist;90_min.

したがって、基本的には CDATA コンテンツを抽出し、それを Name の値と連結する必要があります。

問題の 1 つは、常にタグに含まれているとは限らないことです ... 、、などのString場合もあります ...IntegerTitleBoolean

私はこれを試しました

$ grep -o "Name=\".*\"\|<\!\[CDATA\[.*\]\]>" file.xml | sed 's/<\!\[CDATA\[\"\(.* \)\"\]\]>/\1/'

それは私に与えます

Name="descResist"
resist_type_chimney
90_min.

次の行の前に名前文字列の値を付けるにはどうすればよいですか?

のように

Name="descResist"
resist_type_chimney
90_min.
Name="anotherName"
foo_bar
Name="anoooother"
Name="notempty"
bar_foo

少し複雑になります。

こんなXMLでもいいのでは?ネストされたものもあるはずな<tagType Name=...ので、これは問題にならないと思います。

編集:私は cygwin に取り組んでおり、bash/sed/awk のシンプルなソリューションを探しています。

4

2 に答える 2

2

これを試してください:

#!/bin/bash

Name="InvalidName"
while read line; do
        case "$line" in
                Name=*) eval "$line" ;; # assuming $line is always bash-friendly Name="Value"
                *) echo "$Name;$line" ;;
        esac
done < <(egrep -o 'Name=".*"|<!\[CDATA\[.*?\]\]>' file.xml | sed -r 's/<!\[CDATA\["(.*)"\]\]>/\1/')

拡張正規表現を使用するようにコマンドを少し変更しました (そのため、"egrep" と "sed -r" になっています) ので、少し読みやすくなっています。

私が使用した eval は好きではありませんが、「export -n」はこの場合に奇妙なことを行い、eval を回避するためだけにコードが不必要に複雑になります。

テキスト構造が変更されないことが本当に確実な場合は、Bash で XML を「解析」しても問題ありません。XML をすべて 1 行にまとめて "最適化" することを誰かが決定するとすぐに、あなたは少し乾杯します。

編集

これは、醜い eval のないスクリプトです。

#!/bin/bash

Name="InvalidName"
while read line; do
        case "$line" in
                Name=*) export -n "$line" ;; # assuming $line is always bash-friendly Name=Value
                *) echo "$Name;$line" ;;
        esac
done < <(egrep -o 'Name=".*"|<!\[CDATA\[.*?\]\]>' file.xml | sed -r 's/<!\[CDATA\["(.*?)"\]\]>/\1/; s/Name="(.*)"/Name=\1/')
于 2013-07-02T13:33:08.480 に答える