2

配列に解析したいxmlのようなテキストファイルがあります。入力ファイルは次のようになります

<AA>
  <BB>content 1</BB>
</AA>
<AA>
  <BB>content 2</BB>
</AA>

出力を次のようにします(配列要素ごとに1つのAAブロック全体を意味します):

ARRAY[0]=<AA><BB>content 1</BB></AA>
ARRAY[1]=<AA><BB>content 2</BB></AA>

私は試した

ARRAY=(`cat input.txt | grep -A 3 \<AA\>`)

しかし、これは配列要素ごとに1行しか返しません。誰かアイデアがありますか?

4

4 に答える 4

3

XMLスクリプトとシェルスクリプトはあまりうまく混ざりません。可能であれば、別のファイル形式または別のスクリプト言語の使用を検討してください。

(
    IFS=$'\n'
    ARRAY=($(grep -A 3 '<AA>' test.xml | awk '{printf "%s",$0} $0~"</AA>" {print}'))

    for MATCH in "${ARRAY[@]}"; do
        echo "$MATCH"
    done
)

説明:

  1. IFSを設定して\n、配列要素を分割する方法を制御します。スペースやタブで分割するのではなく、新しい行だけで分割します。
  2. ARRAY=($(COMMAND))COMMANDの出力をキャプチャし、各行を配列要素として受け取ります(IFSをに設定したため\n)。
  3. {printf "%s",$0}末尾の改行なしで各行を印刷します。
  4. $0~"</AA>" {print}終了タグが表示されるたびに改行を出力します</AA>
  5. 変更の範囲を制限するために、すべてが括弧で囲まれてい$IFSます。その変更が永続的になることは望ましくありません。サブシェルに制限することをお勧めします。
于 2012-11-19T16:07:17.323 に答える
1

XMLが整形式の場合、次の例は、 xpathを使用してXMLを適切に解析する方法を示しています。

#!/bin/bash

XML="
<doc>
<AA>
  <BB>content 1</BB>
</AA>
<AA>
  <BB>content 2</BB>
</AA>
</doc>
"

CONTENT1=`echo $XML | xmllint --xpath "string((/doc/AA/BB)[1])" -`
CONTENT2=`echo $XML | xmllint --xpath "string((/doc/AA/BB)[2])" -`

echo $CONTENT1
echo $CONTENT2
于 2012-11-19T22:22:17.217 に答える
1
sed '/^<AA>$/,/^<[/]AA>$/{H;/<[/]AA>/{s:.*::g;x;s:\n::g;s:[ ]*<B:<B:g;b};d}' FILE
于 2012-11-19T16:09:34.690 に答える
0

<AA></AA>が固定名であると仮定すると、これが純粋なbashソリューションです

#!/bin/bash
declare -a ARRAY
while read -r line; do
    [ "$line" =~ ^\<BB\>$ ] && ARRAY+=("<AA>$line</AA>")
done < file.xml
于 2012-11-21T07:17:58.270 に答える