दो तारों को एक दूसरे से बदलें


9

मैं एक स्ट्रिंग के सभी आवृत्तियों (जैसे स्ट्रिंग 1) को दूसरे स्ट्रिंग (स्ट्रिंग 2) और इसके विपरीत के साथ बदलना चाहूंगा। सटीक होने के लिए मेरे पास एक लंबा दस्तावेज़ है और ये तार कई बार होते हैं। वर्तमान में मैं क्या करता हूं, इसे string1 -> string3, फिर string2 -> string1 और अंत में string3 -> string2 को बदलना है।

मैं सोच रहा हूं कि क्या emacs में कोई फंक्शन है जो ऐसा करता है। अन्य समाधानों का स्वागत किया है।

संपादित करें : यह वास्तव में टिप्पणी में जुड़े प्रश्न का एक डुप्लिकेट है। लेकिन समस्या यह है कि उस प्रश्न का स्वीकृत उत्तर हमेशा काम नहीं करता है (नीचे टिप्पणी देखें)। मुझे लगता है कि तब तक इंतजार करना बेहतर है जब तक कि स्वीकार किए गए उत्तर का लेखक अपने जवाब को सही नहीं करता है या कोई अन्य समाधान नहीं निकलता है। दूसरी बात यह कि अपना प्रश्न पोस्ट करने से पहले, मैंने इस सवाल को टाल दिया और वह प्रश्न सामने नहीं आया। मुझे लगता है कि दो डुप्लिकेट प्रश्न कभी-कभी उपयोगी होते हैं क्योंकि वे अलग-अलग शब्दों का उपयोग करते हैं और यदि कोई उपयोगकर्ता डुप्लिकेट पाता है, तो वह सही खोज कर सकता है।

संपादित करें 2: टेक्स्ट को स्वैप करने के लिए खोज / प्रतिस्थापन जैसी सुविधा का स्वीकृत उत्तर अब ठीक लग रहा है।



@ T.Verron मैंने स्क्रैच बफर में "इस" को "उस" के साथ बदलने के लिए आपके लिंक के स्वीकृत उत्तर का उपयोग करने की कोशिश की लेकिन यह काम नहीं करता है।
नाम

शायद मैंने बहुत तेजी से स्वीकार किया। पिछले दो तर्कों को टिप्पणी करते हुए ( backwardsऔर region-noncontiguous-p) perform-replaceयह काम करता है यहाँ (emacs 24.3)। जब मैं किसी अवसर को दूसरे उत्तर को संपादित करने से पहले प्राप्त करता हूं, तो मैं इसे 25 एमएसीएस पर परीक्षण करूंगा।
टी। वेरॉन

@ T.Verron इसके विपरीत, पैकेज प्लूर का उपयोग करने का सुझाव देने वाला अन्य समाधान। यह समस्या के बिना इस स्थिति में काम करने लगता है।
नाम

मैंने अन्य प्रश्न में स्वीकृत उत्तर को बदल दिया है। Google के बारे में, हां, मुझे यह बताने के लिए कीवर्ड खोजने में भी परेशानी हुई कि मैं क्या करने की कोशिश कर रहा था। और हाँ, डुप्लिकेट अच्छे हैं! blog.stackoverflow.com/2010/11/…
टी। वेरॉन

जवाबों:


11

इंटरेक्टिव केस के लिए क्वेरी-रीप्ले-रेगेक्सपी (सीएम-%), रिप्लेसमेंट के लिए अपेक्षाकृत अज्ञात \ _ का उपयोग करके ऐसा कर सकता है।

C-M-% \(string1\)\|\(string2\)
\,(if (equal \& "string1") "string2" "string1")

यदि रिप्लेसमेंट टेक्स्ट में \ _, के बाद एक लिस्प एक्सप्रेशन है, तो यह रिप्लेसमेंट के रूप में उस एक्सप्रेशन के मूल्य का उपयोग करता है। इस मामले में अभिव्यक्ति एक "अगर" है जो एक शर्त और सच्चे और झूठे मामलों के लिए वापसी मूल्य लेता है।

टिप्पणियों में इसका उपयोग करने का सुझाव दिया गया है

\, (if \ 1 "string2" "string1")

यह काम करता है क्योंकि \ n "string1" होगा यदि पैटर्न string1 से मेल खाता है, और अन्यथा शून्य होगा। लिस्प किसी भी गैर-शून्य मूल्य को सच मान लेता है। जब भी यह काम करता है और छोटा होता है, मुझे लगता है कि मेरा उत्तर अधिक उपयोगी है। मुझे लगता है कि यह कोड किसी ऐसे व्यक्ति के लिए अधिक पठनीय है जिसका लिस्प ज्ञान सीमित है। इसका दूसरा फायदा है क्योंकि यह अभी भी काम करता है यदि "से" पैटर्न के रूप में दिया गया है

\(string1\|string2\)

या और भी

string1\|string2

2
डुप्लिकेट उम्मीदवार में कुछ टिप्पणी \,(if \1 "string2" "string1")regexp का उपयोग करते हुए सरल सिंटैक्स का सुझाव दिया \(string1\)\|string2
टी। वेरॉन

के अंतिम दो पैराग्राफ देखें (emacs) Regexp Replace
तुलसी

-1

ठीक है, शायद एक मैक्रो के साथ यह आसान होगा:

F3C-saRETC-bM-tF4। अपने प्रश्न पर इस मैक्रो का उपयोग करने से यह परिणाम प्राप्त होता है:

मैं स्ट्रिंग के सभी आवृत्तियों (जैसे string1) को एक अन्य स्ट्रिंग (स्ट्रिंग 2) और इसके विपरीत के साथ बदलना चाहूंगा। सटीक होने के लिए मेरे पास एक दस्तावेज़ है और ये तार कई बार होते हैं। वर्तमान में मैं क्या करता हूं, इसे string1 -> string3, फिर string2 -> string1 और अंत में string3 -> string2 को बदलना है।

मैं सोच रहा था कि वहाँ पहले से ही एक समारोह में emacs जो यह करता है। अन्य समाधानों का स्वागत किया है।

मैं एक aशब्द और उस शब्द के बाद जो कुछ भी हूं, उसके बीच में स्थिति का हस्तांतरण कर रहा हूं । आप बाद में पूरे मैक्रो को फिर से परिभाषित करने की आवश्यकता के बिना अन्य शब्दों को स्थानांतरित करने के लिए इस तरह के मैक्रो को संपादित कर सकते हैं, आप मैक्रो को इसके साथ संपादित कर सकते हैं C-xC-kRET


1
मुझे नहीं लगता कि सवाल शब्दों को ट्रांसपोज़ करने से संबंधित है।
टी। वेरॉन

@ T.Verron यह है, लेकिन वह एक अधिक स्वचालित दृष्टिकोण चाहता है, ऐसा लगता है।
शक्रा

1
आपका मैक्रो क्या करता है (ट्रांसपोज़िंग) प्रत्येक "ए" अगले शब्द के साथ। "a string"> "string a" आदि वह जो करना चाहता है वह है जैसे कि प्रत्येक "a" को "the" और प्रत्येक "the" को "a" से बदलें।
टी। वेरॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.