Vi में एक फ़ाइल से दूसरी फ़ाइल में सामग्री को कॉपी और पेस्ट करें


256

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

इसके अलावा, क्या कट-पेस्ट का एक तरीका है? मैंने गुग्लिंग की कोशिश की है, लेकिन अधिकांश संसाधन केवल कॉपी-पेस्ट की बात करते हैं।


क्या आप सुनिश्चित हैं कि यह काम नहीं करता है? मैं फ़ाइलों के बीच लाइनों को कॉपी करने के लिए इसका अक्सर उपयोग करता हूं
sjngm

खैर जब मैं ऐसा कर रहा हूं, तो मुझे केवल एक उद्धरण चिह्न मिलता है?
मटका

4
कमांड dd कट की तरह काम करता है।
मार्टिन स्टेलबर्ग

जवाबों:


218

चूँकि आप पहले से ही जानते हैं कि टेक्स्ट को कैसे काटना / काटना है, यहाँ इसे दूसरी फाइल में वापस पेस्ट करने के लिए कुछ विचार दिए गए हैं:

  • पहली फ़ाइल को संपादित करें, जो आप चाहते हैं उस पाठ को yanking। फिर vi ( :e /path/to/other/file) के भीतर से अपनी दूसरी फाइल खोलें और पेस्ट करें
  • एक स्प्लिट विंडो में एक साथ दोनों फाइलें खोलें और Ctrl+ w, Up/ Downया तो का उपयोग करके उनके बीच नेविगेट करें :

    • vi -o /path/to/file1 /path/to/file2
    • पहली फ़ाइल के भीतर से, Ctrl+ w,s

मेरे पास दो पुट्टी खिड़कियां खुली हैं, मैं पहले "विजुअल मोड के लिए v" कर रहा हूं और फिर सभी लाइनों का चयन करता हूं और एक "y" को yanking के लिए करता हूं, न कि मैं दूसरी फाइल पर जाने के लिए एक alt + टैब कर रहा हूं और जब मैं करता हूं पुट के लिए एक "पी", यह केवल एक उद्धरण चिह्न प्रिंट करता है।
मटका

10
यदि आप 2 पोटीन विंडो के साथ काम कर रहे हैं, तो आपको कॉपी / पेस्ट करने के लिए पोटीन / विंडो तरीके का उपयोग करना होगा। यह आसान है। उस सामान को चिह्नित करें जिसे आप अपने माउस के साथ कॉपी करना चाहते हैं (आपको कुछ और करने की ज़रूरत नहीं है, जिसे चिह्नित पाठ अब क्लिपबोर्ड पर कॉपी किया गया है।) अपनी अन्य पोटीन विंडो पर स्विच करें। विम (हिट आई) में प्रविष्टि मोड दर्ज करें। दाएं माउस बटन को दबाएं - एक पोटीन विंडो में राइट माउस क्लिपबोर्ड में जो कुछ भी है उसे पेस्ट करेगा।
nos

3
जो आप कर रहे हैं वह काम नहीं करेगा: vi में Yanking पाठ को आपके Windows क्लिपबोर्ड में नहीं रखेगा, और खुले बफर उदाहरणों के बीच yank बफर साझा नहीं किया गया है।
एडम बाटकिन

1
पहले फ़ाइल के भीतर से *,: मैं समझता हूँ नहीं क्या अंतिम बिंदु करने के लिए माना जाता है Ctrl+ w, s
svassr

1
मेरे लिए इसने खिड़की को खोल दिया लेकिन ठीक उसी फ़ाइल को खोलना। फिर आप किस फ़ाइल को कैसे चुनते हैं? मैंने कमांड देखी है जो :sp myfileक्षैतिज रूप से विभाजित होती है और निर्दिष्ट फ़ाइल को खोलती है, लेकिन अगर मैं खिड़की को लंबवत रूप से विभाजित करना चाहूंगा तो मैं कैसे करूंगा?
svassr

50

यदि आप विंडोज पर विम का उपयोग कर रहे हैं, तो आप क्लिपबोर्ड (एमएस कॉपी / पेस्ट) का उपयोग करके प्राप्त कर सकते हैं:

"*dd - एक लाइन में कटौती (या तीन लाइनों को काटने के लिए 3dd)

"*yy - एक लाइन की नकल (या तीन लाइनों की नकल करने के लिए 3yy)

"*p - कर्सर के बाद लाइन पर पेस्ट लाइन

"*P - कर्सर से पहले लाइन पर पेस्ट लाइन

आपको अलग-अलग विम विंडो के बीच या विम और पीसी एप्लिकेशन ( नोटपैड , माइक्रोसॉफ्ट वर्ड , आदि) के बीच पेस्ट करने देता है ।


17
+क्रॉस-प्लेटफ़ॉर्म सिस्टम क्लिपबोर्ड रजिस्टर (विंडोज और लिनक्स) बनाम के रूप में उपयोग करें *, जो कि केवल विंडोज है (विंडोज +के समान ही काम करता है *)।
स्टीफन स्वेंसन

42

के रूपांतरों का उपयोग करें dकी तरहddकटौती करने के लिए ।

किसी अन्य फ़ाइल के लिए लाइनों की एक सीमा लिखने के लिए आप इसका उपयोग कर सकते हैं:

:<n>,<m> w filename

कहाँ <n>और<m> संख्याएँ (या प्रतीक) हैं जो कई लाइनों को नामित करते हैं।

डेस्कटॉप क्लिपबोर्ड का उपयोग करने के लिए, +gकमांड्स पर एक नज़र डालें ।


अंकों के साथ ऐसा करने के लिए, दो अंक (ए और बी, उदाहरण के लिए) पाठ के आसपास आप एक फ़ाइल पर लिखने के लिए करना चाहते बनाएं: पहला लाइन के लिए कदम ma, अंतिम पंक्ति में चले जाने के, mb। इसके बाद 'जब आप उपरोक्त कमांड का उपयोग कर रहे हैं, तो चिह्न के पत्र को प्रस्तुत करें::'a,'b w filename
EchoLynx

विस्तृत लाइन रेंज के लिए महान समाधान!
यासीन ओकुमुस

29

आप दूसरी फ़ाइल खोल सकते हैं और टाइप कर सकते हैं :r file_to_be_copied_from। या आप बफर कर सकते हैं। या पहली फ़ाइल पर जाएं, उस पंक्ति पर जाएं जिसे आप कॉपी करना चाहते हैं, टाइप करें "qY, उस फ़ाइल पर जाएं जिसे आप पेस्ट करना चाहते हैं और टाइप करें "qP

"बफर_नाम, बफर को कॉपी करता है। Yयांक है और Pडाला जाता है। उम्मीद है की वो मदद करदे!


धन्यवाद! इसने मुझे टन
अत्तुशी यमामोटो

28

यहाँ यह करने का एक तरीका है;

  • Vim प्रारंभ करें और file1 खोलें जो वह फ़ाइल है जिस पर आप काम कर रहे हैं।
  • :e file2 जो file2 लाएगा, जिस फ़ाइल से आप लाइनों को कॉपी करना चाहते हैं।
  • उन पंक्तियों का पता लगाएं जिन्हें आप कॉपी करना चाहते हैं। अगर यह तीन लाइन है, तो आप हिट3yy
  • :b1 यह बफर 1 पर जाएगा, जहाँ फ़ाइल 1 है
  • पता लगाएँ कि आप कहाँ लाइनों को सम्मिलित करना चाहते हैं, और हिट करें p

आपके पास दोनों फाइलें देखने योग्य भी हो सकती हैं। जैसे Ctrl+ के साथ स्क्रीन को विभाजित करें w s

काटने के लिए के रूप में, dकटौती और कटे हुए सामान को यैंक बफर में रखता है। ddएक लाइन "कट" करेगा।


2
ऑफ-टॉपिक: मैं उन कीबोर्ड-बटन जैसी चीजों को कैसे प्राप्त करूं?
Eckes


दो फ़ाइलों के बारे में दो अलग-अलग ssh सर्वरों पर क्या है, जो एक ही क्लाइंट Linux / MacOS में दो अलग-अलग टर्मिनलों में ssh'es है? मेरा मतलब है, कोई पोटीन का उपयोग करने के लिए, और दो फ़ाइलों को एक ही टर्मिनल में एक ही vi सत्र में नहीं खोला जा सकता है।
कियांग जू

1
यदि क्लाइंट दो सर्वरों में ssh कर सकता है, तो यह उन दो सर्वरों के लिए scp या sftp का भी उपयोग कर सकता है। इसलिए सबसे तेज़ तरीका यह है कि आप फ़ाइल को एक सर्वर से दूसरे सर्वर पर कॉपी करें ताकि वे उसी सर्वर पर रहें, उन फाइलों को बताए अनुसार संपादित करें, और यदि आवश्यक हो तो फ़ाइल को दूसरे सर्वर पर वापस कॉपी करें।
ओपन स्कूल

16

ये सभी महान सुझाव हैं, लेकिन यदि आप किसी अन्य फ़ाइल में पाठ का स्थान जानते हैं तो आसानी के साथ sed का उपयोग करें। :r! sed -n '1,10 p' < input_file.txtयह कर्सर की वर्तमान स्थिति में पहले से खुली फ़ाइल में 10 लाइनें डालेगा।


विचित्र रूप से मुझे ओएस एक्स पर इसे चलाने पर 1 का एक एक्जिट कोड मिला, निश्चित रूप से क्यों नहीं।
jayunit100

1
इस सुझाव के लिए धन्यवाद! मैंने सिर के बजाय सिर का इस्तेमाल किया क्योंकि मुझे पहली 2 लाइनें चाहिए थीं::r ! head -n2 file.py
फेडेरिको पोंजी

7

फ़ाइल को संपादित करते समय, अंक बनाएं जहां आप प्रारंभ और अंत का उपयोग करना चाहते हैं

ma- aनिशान सेट करता है

mb- bनिशान सेट करता है

फिर, उसे किसी अन्य फ़ाइल में कॉपी करने के लिए, बस wकमांड का उपयोग करें :

:'a,'bw /name/of/output/file.txt

7

2017-05 अपडेट:

मैंने अभी पाया कि यदि आप अपनी vimrc फ़ाइल में निम्न पंक्ति जोड़ते हैं,

सेट क्लिपबोर्ड = अनाम

तब विम सिस्टम क्लिपबोर्ड का उपयोग कर रहा है।


मैंने अभी-अभी पाया कि yank तरीका उस रास्ते पर काम नहीं करेगा जहाँ मैं विभिन्न Vim आवृत्ति विंडो के बीच सामग्री की प्रतिलिपि बनाता हूँ। (कम से कम, यह मेरे विम ज्ञान के आधार पर काम नहीं करता। मुझे नहीं पता कि क्या इसे काम करने के लिए सक्षम करने का एक और तरीका है)।

याँक तरीका केवल उस रास्ते पर काम करता है जहाँ मेरे परीक्षण के अनुसार एक ही विंडो में कई फाइलें खोली जाती हैं।

यदि आप ऐसा करना चाहते हैं, तो आप बेहतर ओएस कट-कॉपी-पास्ट तरीका जैसे Ctrl+ x, Ctrl+ c(विंडोज के तहत) का उपयोग करेंगे।


5

ये काम मेरे लिए एक आकर्षण की तरह काम करते हैं:

vmap <C-c> "*y     " Yank current selection into system clipboard
nmap <C-c> "*Y     " Yank current line into system clipboard (if nothing is selected)
nmap <C-v> "*p     " Paste from system clipboard

इसलिए, जब मैं दृश्य मोड पर होता हूं, तो मैं उन पंक्तियों का चयन करता हूं जो मैं चाहता हूं और Ctrl+ cऔर फिर Ctrl+ दबाएंv रिसीवर फ़ाइल में पाठ सम्मिलित करने के लिए । आप "* y का उपयोग कर सकते हैं, लेकिन मुझे लगता है कि यह कभी-कभी याद रखना कठिन है।

यह पाठ को विम से क्लिपबोर्ड पर कॉपी करने के लिए भी उपयोगी है।

स्रोत: एक अस्थायी फ़ाइल का उपयोग करके सत्रों के बीच कॉपी और पेस्ट करें


4

दो बफ़र्स (== फ़ाइलें) के बीच पाठ को कॉपी करना जो विम के एक ही उदाहरण में खोले जाते हैं, कोई समस्या नहीं है:

बस के साथ एक बफर में yank y(आप पहले दृश्य मोड में एक प्रतिलिपि क्षेत्र चिह्नित के रूप में चिह्नित), और फिर के साथ अन्य बफर में पेस्ट करें p। यह भी अलग टैब के साथ काम करता है जब तक वे विम के एक ही उदाहरण में हैं।

विम के एक ही उदाहरण में दो फाइलें कैसे खोलें यह आपके सिस्टम पर निर्भर करता है:

  • Win32 पर, यदि आप दो या दो से अधिक फ़ाइलों का चयन करते हैं, तो एक विम के साथ संपादित करें , संदर्भ मेनू में एक विकल्प है
  • जब आप कंसोल पर हों, तो आप इसे प्राप्त कर सकते हैं vim file1 file2
  • यदि आप किसी अन्य उपकरण के लिए संपादक के रूप में विम का उपयोग करते हैं, तो यह सुनिश्चित करने के लिए --remote-silentविकल्प निर्दिष्ट करें कि सभी फाइलें एक ही उदाहरण में खोली जा रही हैं

यदि आपने विम के दो अलग-अलग उदाहरणों में दो फाइलें खोली हैं, तो आपको सिस्टम क्लिपबोर्ड के साथ जाना होगा: पहले विम उदाहरण में, सिस्टम क्लिपबोर्ड में पाठ को "+yफिर से उपयोग करें (फिर से, दृश्य में yanked होने वाले क्षेत्र को चिह्नित करें) ), फिर दूसरे विम पर जाएं और वहां क्लिपबोर्ड पेस्ट करें "+p:।


: टैब्डिट फ़ाइलनाम का उपयोग लक्ष्य फ़ाइल खोलने के लिए किया जा सकता है और फिर बस अपनी पंक्तियों को पेस्ट करने के लिए पी । मुझे लगता है कि यह जल्दी है।
जाबालव

4

लक्ष्य : एक फ़ाइल के टुकड़े को दूसरी फ़ाइल में सहेजें।

समाधान :

  1. वह पाठ चुनें जिसे आप सहेजना चाहते हैं:
    • वह कर्सर रखें जहाँ आप चयन शुरू करना चाहते हैं
    • संपूर्ण लाइनों का चयन vकरने के लिए वर्णों का चयन करने के लिए दबाएं या ऊपर ले Vजाएं
    • कर्सर को उसके अंत में ले जाएं, जिसे आप चुनना चाहते हैं
  2. चयनित फ़ाइल को नई फ़ाइल में सहेजें। टाइप करें :wSpaceऔर नई फ़ाइल का नाम। वास्तव में आप देखेंगे

    :'<,'>w new.txt

    फिर दबायें Enter


टेम्प फाइल से वापस पेस्ट कैसे करें।?
विनीत

3

मेरा परिदृश्य यह था कि मुझे फ़ाइल 1 से फ़ाइल 2 तक n की संख्या को मध्य, n अज्ञात में कॉपी करना था।

:'a,'bw /name/of/output/file.txt

2
  1. सुनिश्चित करें कि आपके पास क्लिपबोर्ड समर्थन के साथ संकलित विम संस्करण है
    • :echo has('clipboard') लौट जाना चाहिए 1
    • अगर यह 0(उदाहरण के लिए Mac OS X, कम से कम v10.11 (El Capitan), v10.9 (Mavericks) और v10.8 (माउंटेन लायन) लौटाता है - एक Vim संस्करण क्लिपबोर्ड सपोर्ट की कमी के साथ आता है), तो आपको एक स्थापित करना होगा क्लिपबोर्ड समर्थन के साथ विम संस्करण, के माध्यम से कहते हैं brew install vim(स्थापना के बाद अपने टर्मिनल को स्थानांतरित करने के लिए मत भूलना)
  2. एक दृश्य मोड दर्ज करें ( V- बहुस्तरीय, v- सादा, या Ctrlv- ब्लॉक-विज़ुअल)
  3. उस पंक्ति का चयन करें जिसे आप कॉपी करना चाहते हैं
  4. "*y - चयनित कॉपी करने के लिए
  5. "*p - कॉपी पेस्ट करना

पुनश्च:

  • आप चरणों से निर्देश के साथ 2-5 की जगह ले सकता जवाब द्वारा JayGयदि आप एक पंक्ति को कॉपी और पेस्ट करने की आवश्यकता है, तो आप
  • लाइनों का चयन करने में आसानी के लिए, आप set mouse+=aअपने लिए जोड़ सकते हैं .vimrc- यह आपको माउस का उपयोग करके विम में लाइनों का चयन करने की अनुमति देगा, जबकि बाहरी तत्वों (जैसे लाइन नंबर, आदि) का चयन नहीं करते हुए नोटिस: यह माउस-चयनित पाठ को कॉपी करने की क्षमता को अवरुद्ध करेगा। Vim से सिस्टम क्लिपबोर्ड पर

1

उदाहरण: फ़ाइलए और फाइलबी - फाइलए में लाइन २५ पर शुरू करें, ५० लाइनों को कॉपी करें, और फाइलबी पर पेस्ट करें

fileA

Goto 25th line

25G

copy 50 lines into buffer v

"v50yy

Goto fileB

:e fileB

Goto line 10

10G    

paste contents of buffer v
"vp

1

नीचे दिया गया विकल्प अधिकतर समय और बाद में चिपकाने के लिए भी काम करता है।

 "xnyy
x - buffer name
n - number of line to Yank - optional

Yanked लाइनों को बफर में संग्रहीत किया जाएगा 'x'। इसे एडिट में कहीं भी इस्तेमाल किया जा सकता है।

दूसरी फ़ाइल में लाइन पेस्ट करने के लिए,

:e filename&location

उदाहरण: वर्तमान एडिट में नीचे कमांड टाइप करें

:e /u/test/Test2.sh
and paste using "xP
P - before cursor
p - after cursor

पूरा ऑपरेशन

फ़ाइल 1 खोलें:

vi Test1.sh

a10yy

-Yanked 10 lines

-अब दूसरी फाइल को करेंट एडिट से खोलें

*:e /u/test/Test2.sh*

जहां-जहां आपको पेस्ट करना है उस लाइन पर कर्सर रखें

*"ap*

- बफर से लिंक '*a*'वर्तमान कर्सर स्थिति के बाद कॉपी किया जाएगा


1

यदि आप किसी फ़ाइल के एक हिस्से को कॉपी करना चाहते हैं और उस सामग्री को किसी अन्य फ़ाइल के बीच में पेस्ट करना चाहते हैं, तो आप इस तरह से कर सकते हैं।

:linenumber,linenumber write newfile

उदाहरण:

:2,34 write temp1

या

:'mark, 'mark write newfile

उदाहरण:

:'a,'b write temp1

अब लाइनों को दूसरी फाइल में कॉपी किया जाता है। यदि आप कॉपी करने के बाद उन लाइनों को हटाना चाहते हैं, तो आप कर सकते हैं

:linenumber1,linenumber2 d

या

:'mark1,'mark2 d

अब, अन्य फ़ाइल पर जाएँ। फिर उस लाइन पर कर्सर रखें जहां आप पेस्ट करना चाहते थे।

प्रकार

:r!cat temp1

अब, अस्थायी फ़ाइल की सामग्री यहाँ चिपकाई गई है। आप सामग्री को चिपकाने के बाद, कमांड लाइन से ही अस्थायी फ़ाइल को हटा सकते हैं।

:!rm temp1

यह मदद करेगा यदि आप कई बार कॉपी और पेस्ट करना चाहते थे।


0

एक और तरीका यह हो सकता है कि दो फ़ाइलों को दो विभाजित बफ़र्स में खोलें और ब्याज की लाइनों के दृश्य चयन के बाद निम्नलिखित "स्निपेट" का उपयोग करें।

:vnoremap <F4> :y<CR><C-W>Wr<Esc>p

0

कमांड मोड दर्ज करें और चलाएं

:r! sed -n '<start_line_num>, <end_line_num> p' file_to_extract_text_from

उदाहरण के लिए वर्तमान में खोली गई फ़ाइल 20-30से लाइनें निकालने के लिएfilename

:r! sed -n '20, 30p' filename
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.