Алгоритм токенизации строки не будет токеризировать
Вопрос
Утро все, я пишу скрипт Bash для извлечения значений определенных тегов XML из всех файлов в данный каталог. Я решил сделать это, токеризирую каждую строку и возвращающуюся токен Revavent TH4E. Проблема в том, что она не товидения правильно, и я не могу полностью отработать, почему. Вот самый маленький пример, который я мог бы сделать, чтобы реконструировать проблему
#!/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