Алгоритм строкового токенизации не будет токенизироваться - PullRequest
0 голосов
/ 07 октября 2010

Утром я пишу bash-скрипт для извлечения значений определенных тегов XML из всех файлов в данном каталоге.Я решил сделать это путем токенизации каждой строки и возврата соответствующего токена.Проблема в том, что это не токенизация правильно, и я не могу понять, почему.Вот самый маленький пример, который я мог бы сделать, который восстанавливает проблему

#!/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 (то есть операцию cat),но это никогда не было проблемой раньше.
Есть идеи?

Спасибо, Рик

1 Ответ

1 голос
/ 07 октября 2010

Используйте лучший инструмент для разбора 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 
...