سؤال

لدي ملف XML يشبه هذا:

<species compartment="compartment" id="alpha_dash_D_dash_glucose_dash_6P" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="six_dash_Phospho_dash_D_dash_gluconate" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="beta_dash_D_dash_Fructose_dash_6P2" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="beta_dash_D_dash_Glucose" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>

كل id السمة أريد استبدالها بسماتي الخاصة. أريد أن يبدو ملفي النهائي هكذا:

<species compartment="compartment" id="id1" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="id2" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="id3" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">
     </species>
     <species compartment="compartment" id="id4" initialAmount="0" hasOnlySubstanceUnits="true" constant="false" boundaryCondition="false">

لكن id تتم الإشارة إلى السمة في أماكن أخرى في الملف:

 <speciesReference constant="true" stoichiometry="1" species="alpha_dash_D_dash_glucose_dash_6P">

يجب تحديث هذا الخط إلى:

 <speciesReference constant="true" stoichiometry="1" species="id1">

حاولت استخدام sed مع 's/id="(*)"/id="$IdCOUNTER"/g' لكن هذا يجعل كل شيء id يعزى نفس الشيء. كيف يمكنني حل هذا؟ هو موضع تقدير أي مساعدة، شكرا لك.

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

المحلول

sed -n 's/\s*<species [^>]* id="\([^"]*\).*/\1/p' species.xml |\
  cat -n |\
  sed 's/\s*\([0-9]\+\)\s*/id\1 /' > ids.txt

cp species.xml my_species.xml

while read a b
do
  sed -i 's/"'"$b"'"/"'$a'"/g' my_species.xml
done < ids.txt

على افتراض أن ملف XML الخاص بك قد تم تنسيقه بشكل جيد (أي ، كل علامة في كل سطر واحد) ، يمكنك الابتعاد عن SED و Bash. خلاف ذلك ، ستحتاج إلى لغة مع محلل XML. سوف ينجح نفس النهج ، لكن التفاصيل ستختلف.

قم بعمل خريطة للمعرفات للبدائل. ثم ، في كل مرة تواجه فيها معرف رأيته من قبل ، تبحث عنه واستبداله.

ال sed الخط فوق خرائط كل معرف من أ <species> علامة إلى معرف مرقوق (تسمح الانزلاق الخلفي بتقسيم الخط على عدة خطوط لقابلية القراءة).

يتم نسخ الملف لمنع تعديل الأصل.

عند قراءة كل سطر من ملف خريطة المعرف ، يتم استبدال جميع حوادث المعرف الأصلي بالمعرف الجديد والرقم.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top