كيف يمكنني المباراة مرارا وتكرارا من حتى ب في VIM؟

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

  •  09-09-2019
  •  | 
  •  

سؤال

أحتاج إلى الحصول على كل النص بين <Annotation> و </Annotation>, ، أين الكلمة MATCH يحدث. كيف يمكنني أن أفعل ذلك في VIM؟

<Annotation about="MATCH UNTIL </Annotation>   " timestamp="0x000463e92263dd4a" href="     5raS5maS90ZWh0YXZha29rb2VsbWEvbGFza2FyaS8QyrqPk5L9mAI">                                                                        
  <Label name="las" />
  <Label name="_cse_6sbbohxmd_c" />
  <AdditionalData attribute="original_url" value="MATCH UNTIL </Annotation>       " />
</Annotation>
<Annotation about="NO MATCH" href="     Cjl3aWtpLmhlbHNpbmtpLmZpL2Rpc3BsYXkvbWF0aHN0YXRLdXJzc2l0L0thaWtraStrdXJzc2l0LyoQh_HGoJH9mAI">
  <Label name="_cse_6sbbohxmd_c" />
  <Label name="courses" />
  <Label name="kurssit" />
  <AdditionalData attribute="original_url" value="NO MATCH" />
</Annotation>
<Annotation about="MATCH UNTIL </ANNOTATION>     " score="1" timestamp="0x000463e90f8eed5c" href="CiZtYXRoc3RhdC5oZWx     zaW5raS5maS90ZWh0YXZha29rb2VsbWEvKhDc2rv8kP2YAg">
  <Label name="_cse_6sbbohxmd_c" />
  <Label name="exercises_without_solutions" />
  <Label name="tehtäväkokoelma" />
  <AdditionalData attribute="original_url" value="MATCH UNTIL </ANNOTATION>" />
</Annotation>
هل كانت مفيدة؟

المحلول

يفعل ذلك يجب أن يتم القيام به داخل VIM؟ هل يمكن أن تغش، وفتح نافذة ثانية حيث يمكنك أن تقوم بأنبس شيء أكثر / أقل، يخبرك برقم السطر الذي يجب أن يذهب إليه داخل VIM؟

-- تعديل --

لم أفعل أبدا مباراة متعددة الخطوط في السادس [م]. ومع ذلك، والغش في نافذة أخرى:

perl -n -e 'if ( /<tag/ .. /<\/tag/)' -e '{ print "$.:$_"; }' file.xml | less

سيظهر العناصر / الكتل عن "العلامة" (أو أسماء مطابقة "أخرى)، مع أرقام الخطوط، في أقل، ويمكنك بعد ذلك البحث عن النص الآخر داخل كل كتلة.

قريب بما فيه الكفاية؟

-- تعديل --

داخل "أقل"، النوع

/MATCH

للبحث عن تكرارات المباراة. على الهامش الأيسر سيكون رقم الخط حيث تكون هذه الحالة (داخل العنصر / العلامات المستهدفة).

داخل السادس [م]، النوع

:n

حيث "n" هو رقم الخط المطلوب.

بالطبع، إذا كان ما تريد فعله حقا كان نوعا من البحث / يانك / استبدال، فهو أكثر تعقيدا. في تلك المرحلة، AWK / PERL / RUBY (أو شيء مماثل يلبي الأذواق الخاصة بك ... أو XSL؟) هي حقا الأداة التي يجب استخدامها للتحول.

نصائح أخرى

أولا، إخلاء المسئولية: أي محاولة لتقطيع وشركة XML مع تعبيرات منتظمة هشة؛ سيكون محلل XML الحقيقي أفضل.

النمط:

\(<Annotation\(\s*\w\+="[^"]\{-}"\s\{-}\)*>\)\@<=\(\(<\/Annotation\)\@!\_.\)\{-}"MATCH\_.\{-}\(<\/Annotation>\)\@=

دعونا كسرها ...

المجموعة 1 هي <Annotation\(\s*\w\+="[^"]\{-}"\s\{-}\)*>. وبعد يطابق علامة بدء عنصر السمة. تتطابق المجموعة 2، التي يتم تضمينها في المجموعة 1، مع سمة ويمكن تكرارها 0 مرات أو أكثر.

المجموعة 2 هي \s*\w\+="[^"]\{-}"\s\{-}. وبعد تستخدم معظم هذه القطع بشكل شائع؛ الأكثر غرابة هو \{-}, ، مما يعني التكرار غير الجشع (*? في التعبيرات العادية متوافقة مع بيرل). تطابق Whitespace غير الجشع في النهاية أمر مهم للأداء؛ بدونها، سيحاول VIM كل طريقة ممكنة لتقسيم المسافة بيضاء بين السمات بين \s* في نهاية المجموعة 2 و \s* في بداية الحدوث التالي للمجموعة 2.

تلي المجموعة 1 \@<=. وبعد هذا هو عرض إيجابي عرض صفر. يمنع علامة البدء من إدراجها في النص المتطابق (على سبيل المثال، ل S ///).

المجموعة 3 هي \(<\/Annotation\)\@!\_.. وبعد ويشمل المجموعة 4، التي تتطابق مع بداية علامة نهاية السمة. ال \@! هو عرض سلبي العرض الصفر \_. يطابق أي شخصية (بما في ذلك الخطوط الجيونية). معا، تتطابق هذه المجموعات بأي شخصية باستثناء حيث تبدأ علامة نهاية السمة. المجموعة 3 تليها علامة التكرار غير الجشع \{-} بحيث يطابق أصغر كتلة من النص قبل المباراة. إذا كنت تستخدم \_. بدلا من المجموعة 3، يمكن أن يشمل النص المتطابق علامة نهاية العنصر التوضيحي ليس تشمل المباراة والاستمرار في العنصر التوضيحي التالي مع المباراة. (جربها.)

الشيء التالي بسيط واضح: ابحث عن تطابق وعدد الأدنى من الأحرف الأخرى قبل وضع علامة النهاية.

المجموعة 5 سهلة: إنها علامة النهاية. \@= هو عرض إيجابي عرض صفر، الذي يتم تضمينه هنا لنفس السبب مثل \@<= لبدء العلامة. علينا أن نكرر <\/Attribute بدلا من استخدام \4 لأن المجموعات مع معدلات العرض الصفرية لا تم التقاطها.

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