سؤال

لدي شيء أقرب <Foobar Name='Hello There'/> وتحتاج إلى تغيير علامات الاقتباس الفردية إلى علامات الاقتباس المزدوجة. حاولت :s/\'.*\'/\"\0\" لكنه انتهى به الأمر <Foobar Name="'Hello There'"/>. استبدال \0 مع \1 أنتجت فقط سلسلة فارغة داخل عروض الأسعار المزدوجة - هل هناك بعض بناء الجملة الخاص الذي أفتقده أنني بحاجة إلى عمل السلسلة التي تم العثور عليها فقط ("Hello There") داخل علامات الاقتباس \1?

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

المحلول

تحتاج إلى استخدام المجموعات:

:s/\'\(.*\)\'/\"\1\"

بهذه الطريقة ستتوافق الوسيطة 1 (أي ، 1) مع كل ما يتم تحديده بواسطة (و ).

نصائح أخرى

هناك ايضا المحيط, ، إذا كنت تتطلع إلى القيام بذلك إلى حد ما. كنت تستخدم cs'" لتغيير الاقتباسات المحيطة.

%s/'\([^']*\)'/"\1"/g

سترغب في استخدام [^']* بدلاً من .* غير ذلك

'apples' are 'red' سيتم تحويلها إلى "apples' are 'red"

ما لم أفتقد شيئًا ، أليس كذلك s/\'/"/g الشغل؟

مجرد FYI - لاستبدال جميع علامات الاقتباس المزدوجة ، هذا هو regexp الصحيح - استنادًا إلى مثال Rayd09 أعلاه

:%s/"\([^"]*\)"/'\1'/g

تحتاج إلى وضع أقواس مستديرة حول جزء من التعبير الذي ترغب في التقاطه.

s/\'\(.*\)\'/"\1"/

ولكن ، قد تواجه مشاكل مع المطابقة غير المقصودة. هل يمكن أن تكون قادرًا على استبدال أي علامات اقتباس واحدة مع عروض أسعار مزدوجة في ملفك؟

لديك الفكرة الصحيحة - تريد أن يكون لديك "\1" كقائم استبدالك ، ولكن تحتاج إلى وضع جزء "Hello" في مجموعة Capture 1 أولاً (0 هو المباراة بأكملها). محاولة:

:%/'\(.*\)'/"\1"

على افتراض أنك تريد القيام بذلك على ملف كامل ...

وضع n:

ggvG$ [SHIFT+:]  

وضع x:

'<,'>/'/" [RET]
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top