استبدال علامات الاقتباس حول الأوتار في VIM؟
سؤال
لدي شيء أقرب <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]