سؤال

صباح كل شيء ، أنا أكتب نص Bash لاستخراج قيم بعض علامات XML من جميع الملفات في دليل معين. لقد قررت القيام بذلك عن طريق رمز كل سطر وإعادة رمز 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 نفسها (أي عملية CAT) ، لكن هذا لم يكن مشكلة من قبل.
أيه أفكار؟

شكرا يا ريك

هل كانت مفيدة؟

المحلول

استخدم أداة أفضل لتحليل 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