Алгоритм токенизации строки не будет токеризировать

StackOverflow https://stackoverflow.com/questions/3881052

  •  28-09-2019
  •  | 
  •  

Вопрос

Утро все, я пишу скрипт 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 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top