質問

朝、すべて、特定のディレクトリ内のすべてのファイルから特定のXMLタグの値を抽出するBASHスクリプトを作成しています。私は各ラインをトークン化し、TH4E Relaventトークンを返すことでこれを行うことにしました。問題は、それが正しくトークン化されておらず、私はその理由を完全に解決することができないということです。これが問題を再構築することができる最小の例です

#!/bin/bash
for file in `ls $MY_DIRECTORY`
do
    for line in `cat $MY_DIRECTORY/$file`
    do
        LOCALIFS=$IFS
        IFS=<>\"

        TOKENS=( $line )
        IFS=$LOCALIFS
        echo "Token 0: ${TOKENS[0]}" 
        echo "Token 1: ${TOKENS[1]}" 
        echo "Token 2: ${TOKENS[2]}" 
        echo "Token 3: ${TOKENS[3]}" 

    done
 done

問題は、それ自体がIFS(つまり猫の操作)を使用するループ内のIFSをいじることに関係していると思いますが、これはこれまでに問題になりませんでした。
何か案は?

ありがとう、リク

役に立ちましたか?

解決

より良いツールを使用してXMLを解析します。理想的にはパーサーである必要がありますが、要件が単純で、XMLがどのように構造化されているかがわかっている場合は、簡単な文字列操作で十分かもしれません。たとえば、XMLファイルとあなたはの価値を取得したい tag3

$  cat file
blah
<tag1>value1 </tag1>
<tag2>value2 </tag2>
<tag3>value3
</tag3>
blah

$ awk -vRS="</tag3>" '/tag2/{ gsub(/.*tag3>/,"");print}' file
value3

したがって、ディレクトリを繰り返します

for file in *.xml
do
  value="$(awk -vRS="</tag3>" '/tag2/{ gsub(/.*tag3>/,"");print}' "$file" )"
  echo "$value"
done 
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top