Emacs

2009-06-29 15 views
8

के साथ Regex प्रतिस्थापन मैं search and replace with regexs करने की कोशिश कर रहा हूं।Emacs

मान लीजिए कि मेरे पास foreach(foo1.txt, foo2.txt, foo3.txt, foo4.txt) है। । क्या मैं गलत कर रहा हूँ कि इस regex (foo[1-4]\.txt) -> "\&" काम करेगा

लेकिन यह नहीं है

- और मैं "प्रत्येक आइटम के आसपास सूची में डाल करना चाहते हैं

मैं प्रलेखन से सोचा।।?

उत्तर

8

ध्यान दें कि कोष्ठक और कोष्ठक ("अतिरिक्त स्लैश") से बचने की जरूरत है खोज regexp में, लेकिन में regexp को प्रतिस्थापित नहीं करें।

भागने की आवश्यकता है क्योंकि लिस्प-पार्सर रेगेक्स इंजन से पहले रेगेक्स देख रहा है।

लेकिन, यदि आप प्रोग्रामेटिक रूप से लिख रहे हैं (इंटरैक्टिव एंट्री के विपरीत), तो आप भागने से बचने की जरूरत है! ay-यी-यी ....

interactive: 
M-x replace-regexp RET \(obj.method(.*)\{1\}\) RET trim$(\1) 

programmatic: 
(replace-regexp "\\(obj.method(.*)\\{1\\}\\)" "trim$(\\1)") 

भाग निकले कोष्ठक बच गए हैं क्योंकि वे समूहीकरण कर रहे हैं नहीं छोड़ा जाएगा कोष्ठक शाब्दिक कोष्ठक हैं।

आप Emacs Wiki Regex Crash Course और Steve Yegge's Effective Emacs regex section देख सकते हैं।

+2

सहायक, लेकिन थोड़ा डरावना। "भागने से बचें"। Meep। –

2

क्योंकि वे पर्ल नहीं कर रहे हैं, मुझे हमेशा बाहर पकड़ने regexps इस \(foo[1-4]\.txt\)

2

Emacs की तरह कुछ का प्रयास करें:

\(foo[1-4]\.txt\) 

आपको Emacs में ब्रैकेट को बैकस्लैश करने की आवश्यकता है।

1

आपको पहले से ही regexp के बारे में सही उत्तर मिल गया है, लेकिन इस मामले में इसके बजाय मैक्रोज़ का उपयोग करना आसान होगा। पहला नाम की शुरुआत में बिंदु रखो, और प्रकार:

C-x (" M-f M-f " C-f C-f C-x) 

है, मैक्रो रिकॉर्डिंग शुरू, बोली डालें, दो शब्दों आगे जाने, बोली डालें, अगले तत्व के लिए आगे दो अक्षर जाते हैं, और रिकॉर्डिंग बंद मैक्रो।

फिर C-x e के साथ मैक्रो चलाएं। दोहराने के लिए, बस e फिर से दबाएं।

(Emacs 23 में, आप F3 बजाय 'C-x (' का उपयोग कर सकते हैं, और दोनों 'C-x)' और 'C-x e' के स्थान पर F4।)