2010-11-16 17 views
15

जोड़कर खोज और प्रतिस्थापित करें, मुझे पता है कि यह एक लंबा शॉट है, लेकिन मेरे पास एक बड़ी टेक्स्ट फ़ाइल है और मुझे कुछ मानदंडों से मेल खाने वाली अन्य संख्याओं में दिए गए नंबर को जोड़ने की आवश्यकता है।एक खोज

उदा।

identifying text 1.1200 
identifying text 1.1400 

और मैं

identifying text 2.2700 
identifying text 2.2900 

आम तौर पर मैं अजगर में ऐसा होता है (कहना 1.15 जोड़कर) इस परिणत करना चाहते हैं, लेकिन यह एक Windows मशीन पर है कि मैं कहाँ स्थापित नहीं कर सकता बहुत सारी चीज़े। मैं हालांकि :)

उत्तर

16

यहाँ एक सरलीकरण और 'हाब्स समाधान पर एक ठीक है:

:%s/identifying text \zs\d\+\(.\d\+\)\=/\=(1.15+str2float(submatch(0)))/ 

\zs के लिए धन्यवाद, वहाँ प्रमुख पाठ याद करने के लिए कोई जरूरत नहीं है। str2float() के लिए धन्यवाद एक पूर्ण जोड़ पूरे नंबर पर किया जाता है (दूसरे शब्दों में, 1.15 + 2.87 अपेक्षित परिणाम, 4.02, और 3.102 नहीं देगा)।

बेशक इस समाधान विम के हाल के एक संस्करण की आवश्यकता है (7.3?)

+0

+1। * मैं * इसे काम करने के लिए भी प्राप्त कर सकता हूं (और यह बहुत कुछ कह रहा है) लेकिन पिछला शून्य बनाए रखने का कोई तरीका है। –

+2

'printf()' के साथ हो सकता है? (: एच printf()) -> '... \ = printf ('%। 4f', 1.15 + str2float (......))' –

+1

मुझे कुछ चीज देखना था: '\ =' अनुमति देता है एक अभिव्यक्ति होने के लिए प्रतिस्थापन स्ट्रिंग। ([लिंक] (http://vim.wikia.com/wiki/Using_an_expression_in_substitute_command)) –

1

विम मिल गया है पूर्णांकों के लिए आप सिर्फ एक संख्या को n जोड़ने के लिए n^एक का उपयोग कर सकते हैं (और n^एक्स यह घटाना)। मुझे संदेह है कि क्या यह आंशिक संख्याओं के लिए काम करता है।

+2

यह काम करता है के साथ 300 लाइनों अगर लेकिन ऐसा करने के लिए, ओपी को 1501 एन^ए की जरूरत है। –

3

आपका नंबर प्रारूप एक निश्चित प्रतीत होता है, इसलिए int में कनवर्ट करना आसान है और वापस आना (डॉट को हटाएं) 11500 जोड़ें और डॉट को वापस रखें।

:%s/\.// 
:%normal11500^A " type C-V then C-a 
:%s/....$/.&/ 

आप ऐसा करने के लिए सभी लाइनों पर, लेकिन केवल एक है जो मैच 'पाठ की पहचान' नहीं करना चाहते हैं के द्वारा सभी% की जगह 'जी/indentifying पाठ /'

10

आप एक कर सकते हैं रेगुलर एक्सप्रेशन से कब्जा करने के लिए और फिर एक स्थानापन्न के रूप में एक vimscript अभिव्यक्ति का उपयोग, (केवल LINEBREAK बिना)

:%s/\(identifying text \)\(\d\+\)\.\(\d\+\)/ 
    \=submatch(1) . (submatch(2) + 1) . "." . (submatch(3) + 1500) 

की तरह कुछ।

1

खैर इस vim के लिए एक समाधान नहीं हो सकता है लेकिन मुझे लगता है awk मदद कर सकते हैं:

cat testscript | LC_ALL=C awk '{printf "%s %s %s %s %.3f\n", $1,$2,$3,$4,$5+1.567 }' 

और परीक्षण

this is a number 1.56 
this is a number 2.56 
this is a number 3.56 

मैं चल के सही रूपांतरण के लिए LC_ALL = सी की जरूरत बिंदु विभाजक, और हो सकता है कि स्ट्रिंग की शुरुआत/शेष मुद्रण के लिए एक और अधिक सुरुचिपूर्ण समाधान हो। और परिणाम लगता है:

this is a number 3.127 
this is a number 4.127 
this is a number 5.127 
+0

बांध!बस पढ़ें कि यह एक विंडोज़ मशीन है, इसलिए अजीब भूल जाओ: डी – joecks

+0

धन्यवाद अभी भी। आप कभी नहीं जानते कि यह आसान हो सकता है ... –

1

का उपयोग मैक्रो

qa .......................... start record macro 'a' 
/iden<Enter> ................ search 'ident*' press Enter 
2w .......................... jump 2 words until number one (before dot) 
Ctrl-a ...................... increases the number 
2w .......................... jump to number after dot 
1500 Ctrl-a ................. perform increases 1500 times 
q ........................... stop record to macro 'a' 

आप इस पद्धति अभी बनाने

[email protected] 
+0

ओपी 1.15 के साथ एक नंबर ("** एक ** दिया गया नंबर" <- एकवचन) बढ़ाने की इच्छा रखता है, और दो अलग-अलग संख्या नहीं। –

संबंधित मुद्दे