कोई भी टेक्स्ट एडिटर जो रिप्लेसमेंट टेक्स्ट के लिए कुछ गणित लगा सकता है?


15

मेरे पास बड़ी XML फ़ाइल है

<obj param="2542">
<obj param="2333">
<obj param="6433">

मुझे कुछ संख्या से सभी "परम" मूल्यों को बढ़ाने की आवश्यकता है। मैं कई संपादकों में regexp खोज के साथ संख्या की आवश्यकता कर सकता हूं, लेकिन प्रतिस्थापन में कुछ गणित कैसे लागू करें?


1
क्या ऑपरेटिंग सिस्टम? क्या आप इसके बजाय एक शेल स्क्रिप्ट से खुश होंगे (जो काफी आसान होगा)? वैसे भी, मुझे यकीन है vimऔर emacsइस तरह का काम कर सकते हैं, लेकिन इसके लिए एक कमांड का उपयोग करने के बजाय स्क्रिप्ट लिखने की आवश्यकता हो सकती है।
frabjous

खिड़कियों के नीचे @frabjous। मैं यदि संभव हो तो कुछ भी नहीं लिखूंगा। लेकिन यदि आप एक शेल स्क्रिप्ट पोस्ट करते हैं तो मुझे यकीन है कि यह कई लोगों के लिए उपयोगी होगा।
serg

जवाबों:


18

चारों ओर थोड़ा और प्रहार करने के बाद, यह पता चला है कि विम बिना स्क्रिप्टिंग के, एक ही आदेश के साथ कर सकता है। उदाहरण के लिए, निम्नलिखित सभी संख्याओं को जोड़ने के लिए जिनका <obj param="आप उपयोग कर सकते हैं:

:%s@<obj param="\(\d\+\)@\='<obj param="' . (submatch(1) + 50)@g

मुझे वह टूट जाने दो।

: vim में कमांड-लाइन मोड में प्रवेश / संकेत करने का सामान्य तरीका है।

%पूरे दस्तावेज़ के दायरे के भीतर का मतलब; आप एक संख्या सीमा में रख सकते हैं, उदाहरण के लिए, 1,50इसे पहले 50 लाइनों के बजाय करने के लिए।

s विकल्प के लिए आशुलिपि है (आप चाहें तो पूरा शब्द लिख सकते हैं)

@सीमांकक है; आप किसी अन्य वर्ण का उपयोग तब तक कर सकते हैं जब तक आप जो खोज रहे हैं वह उसमें नहीं है। बस इसे तीन बार उपयोग करें। (वाक्य रचना के समान है sed।)

परिसीमन की अगली घटना तक सब कुछ @ के लिए खोज करने के लिए रेग पूर्व पैटर्न है, इस मामले में <obj param="उसके बाद \d\+, जो अंकों की संख्या है। \(और \)वहाँ एक भी reg पूर्व समूह है जो की तरह backreferences से मेल खाएंगे के रूप में अंकों की इस पूरे अनुक्रम सेट करने के लिए कर रहे हैं \1, या vim के submatchआदेश।

तब सीमांकक @चिह्नित करता है कि प्रतिस्थापन पाठ के रूप में क्या होता है।

\=यहाँ शुरुआत साधन में नहीं बल्कि एक रेग पूर्व पैटर्न या स्ट्रिंग है, जो यहाँ कुंजी है की तुलना में कुछ का मूल्यांकन अभिव्यक्ति का परिणाम स्थानापन्न करने,।

फिर हमारे पास '<obj param="'प्रतिस्थापन पाठ की शुरुआत के लिए है। .जो इस प्रकार तार श्रृंखलाबद्ध के लिए vim के कार्य है।

submatch(1)एक vim बिल्ट-इन फंक्शन है जिसे केवल एक प्रतिस्थापन कमांड के भीतर इस्तेमाल किया जा सकता है, और स्ट्रिंग को वापस करता है जो रेगेक्स के समान है \1; आप submatch(2)रेगेक्स \2और इतने पर के बराबर के लिए उपयोग करेंगे । ( \0संपूर्ण मिलान किया हुआ पैटर्न है, लेकिन हम यहां ऐसा नहीं चाहते हैं।) \(और \)खोज पैटर्न में इस बात का उपयोग किया जाता है कि क्या मायने रखता है submatch(1)

इसलिए (submatch(1) + 50)50 को उस संख्या में जोड़ने का परिणाम देता है जो <obj param="खोज पैटर्न में निम्नलिखित अंकों का होता है।

@प्रतिस्थापन पाठ के अंत को चिह्नित करने के लिए सीमांकक का फिर से उपयोग किया जाता है।

ध्वज gका उपयोग प्रतिस्थापन को वैश्विक बनाने के लिए किया जाता है; यदि आप केवल प्रत्येक पंक्ति पर पहला उदाहरण बदलना चाहते हैं, तो आप इसे छोड़ सकते हैं।

आप शायद वहां से अलग-अलग संख्याओं को जोड़ने, या घटाना, या विभाजित करने आदि के लिए काम कर सकते हैं।


यह बहुत अच्छा है, मेरे पास एक GPX फाइल थी जो भ्रष्ट थी क्योंकि देशांतर मान पूरी तरह से अमान्य थे। सौभाग्य से, अक्षांश ठीक था इसलिए एक मानचित्र का उपयोग करके मैं यह काम करने में सक्षम था कि पहला सही मूल्य क्या होना चाहिए, कुछ गणित करें, और यह काम करें कि मुझे इसे प्राप्त करने के लिए प्रत्येक मूल्य से 4294.567548 को घटाना चाहिए। मेरे पास एक ही ठोकर थी कि यह तरीका फ्लोटिंग पॉइंट नंबर पर काम नहीं करता था, इसलिए मैंने बस दशमलव बिंदु के प्रत्येक पक्ष को अलग-अलग प्रतिस्थापन, एक -4294 और एक -567548 के रूप में किया।
स्टफ

7

एमएसीएस में (संस्करण 23 के बाद से): रीजेक्स रिप्लेसमेंट\, में मनमानी लिस्प कोड निष्पादित करने के लिए उपयोग करें । उदाहरण के लिए, आपके द्वारा उपयोग किए जा सकने वाले नंबरों को स्क्वायर करने के लिए

M-x replace-regexp
param="\([0-9]+\)"
param="\,(* \#1 \#1)"

विम में: \=(देखें :help sub-replace-special) के साथ अपना प्रतिस्थापन पाठ शुरू करें । उदाहरण के लिए, संख्याओं को वर्ग के लिए:

s!param="\([0-9]\+\)"!\='param="'.submatch(1)*submatch(1).'"'!

कई संपादक आपको मैक्रोज़ के साथ इस तरह की चीजें करने की अनुमति देते हैं: एक मैक्रो को परिभाषित करें जो अगले मैच के लिए दिखता है और 2. प्रतिस्थापन करता है (यदि आवश्यक हो तो अंकगणित के लिए एक बाहरी उपकरण का उपयोग करके); मैक्रो को उतने बार दोहराएं जितना आपके पास मैच है।


अधूरा जवाब। लघु और आप 2 संपादकों + सामान्य मामले को कवर करते हैं।
derekv

1

आप अपने लिए ऐसा करने के लिए विम का उपयोग कर सकते हैं। बस अपनी फ़ाइल खोलें और एक मैक्रो रिकॉर्ड करें । उदाहरण: किसी भी संख्या के लिए खोजें

/[0-9]{1,}

उसके बाद q और (रजिस्टर में स्टोर मैक्रो) को दबाएँ। उसके बाद, Ctrl-X दबाएं (संख्या को 1 से बढ़ाकर) और बाद में n (अगले खोज परिणाम के लिए) दबाएँ। आपके द्वारा ऐसा करने के बाद, मैक्रो को बचाने के लिए फिर से q दबाएं। अब आप @ + a दबाकर मैक्रो को अगले नंबर पर लागू कर सकते हैं। यह वर्तमान संख्या को बदल देगा और अगले एक पर कूद जाएगा। उस @ x को दोहराने या उपयोग करके, आप उस x को दोहरा सकते हैं।

खैर, यह वर्णन यह दिखाने के लिए पर्याप्त नहीं है कि यह कैसे किया जा सकता है। बस एक ट्यूटोरियल का संदर्भ दें जो मैक्रो तंत्र का वर्णन करता है।


क्या होगा यदि मुझे संख्या 1 से नहीं बल्कि एक लाख से बदलनी पड़े? या शायद कुछ गुणा / भाग का उपयोग करें?
सेग

1
यदि आप प्रत्येक संख्या में निरंतर x जोड़ना चाहते हैं तो यह आसान है: x + Ctrl + a। क्या आपको अलग-अलग नंबर जोड़ने की जरूरत है?
ईवू
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.