हर पंक्ति के पहले चार वर्णों को उसी पंक्ति के अंत में कैसे कॉपी करें?


10

लाइनों की एक श्रृंखला को देखते हुए जो इस के समान हैं:

2001 "Some Kind of Title," Author's Name, Publication Name, 1 Mar.
2002 "Some Kind of Title," Author's Name, Publication Name, 12 Oct.
2003 "Some Kind of Title," Author's Name, Publication Name, 8 Apr.
2004 "Some Kind of Title," Author's Name, Publication Name, 3 Jun.

क्या कोई ऐसा तरीका है जो मैं उन पहले चार पात्रों (वर्ष) को पकड़ सकता हूं, और उन्हें पंक्ति के अंत में कॉपी कर सकता हूं, ताकि यह इस तरह दिखे:

2001 "Some Kind of Title," Author's Name, Publication Name, 1 Mar. 2001
2002 "Some Kind of Title," Author's Name, Publication Name, 12 Oct. 2002
2003 "Some Kind of Title," Author's Name, Publication Name, 8 Apr. 2003
2004 "Some Kind of Title," Author's Name, Publication Name, 3 Jun. 2004

7
यकीन है कि वहाँ है: :%g/^\d\{4}\d\@!/s/^\(\d\{4}\).*\zs/ \1/
सातो कैटसुरा

जवाबों:


17
:% s/\v^(\d{4})(.*)$/\1\2 \1/ 

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

  • \v जादू विकल्प, समूह से बचने के लिए बचने के लिए ()
  • ^ लाइन की शुरुआत
  • \d{4} चार अंकों का मिलान करें
  • .* बाकी लाइन
  • \1 \2 भीतर मिलान पैटर्न है ()

संपादित करें: @ जेयर लोपेज टिप्पणियों में उल्लेख करते हैं, नियमित अभिव्यक्ति को और बेहतर बनाया जा सकता है:

:% s/\v^(\d{4}).*/& \1/ 

या समकक्ष

:% s/\v^(\d{4}).*/\0 \1/ 
  • &और \0पूरे मिलान पैटर्न शामिल हैं

आगे पढ़ने के लिए, vimregex और regex FAQ


3
:%s/\v^(\d{4}).*/& \1/एक छोटा कमांड होगा।
जेयर लोपेज़

10

और मैक्रो के साथ एक समाधान:

qqyiwA <Esc>pj0q

जिसका मतलब है:

qq   Record the macro in the register q
yiw  Yank the text described by the text object iw (inner word): The date
A <Esc>   Append a white space to the end of the line and go back to insert mode
p    Paste the date
j0   Place your cursor on the first column of the next line (to be able to repeat the macro)
q    Stop recording

आप तब मैक्रो को फिर से चला सकते हैं जब तक आपके पास लाइन है 3@a

संपादित के रूप में @evilsoup टिप्पणी में यह उल्लेख किया है, बफर के सभी लाइनों पर मैक्रो निष्पादित करने के लिए एक अधिक प्रभावी तरीके से उपयोग करने के लिए है:

:%normal @q

आप निश्चित रूप से जगह ले सकता है %एक से सीमा लाइनों को संशोधित करने का वर्णन।


3
आप इसे हर लाइन पर भी लागू कर सकते हैं:%normal @q
evilsoup

@evilsoup: उल्लेख करने के लिए धन्यवाद, मैं उत्तर संपादित करूँगा।
statox

6

यहाँ तरीका है कि मैं यह करना होगा:

:%norm y4lA <C-o>p

स्पष्टीकरण:

:%norm                     "Apply the following keystrokes to every line:
       y4l                 "Yank 4 letters. You could also do 'yiw'
          A                "Add a space to the end
            <C-o>          "Do a single normal command
                 p         "Paste

4

यदि आपके पास मानक UNIX आदेशों तक पहुँच है, तो आप उपयोग कर सकते हैं AWK:

:%!awk '{print $0" "$1}'

वास्तव में vi / vim नहीं, तब, या पहले चार वर्ण।
पाइप

1
ध्यान :help filterमें रखते हुए एक अंतर्निहित Vim सुविधा है और यह देखते हुए कि यह सुविधा कितनी अच्छी तरह से UNIX प्रतिमान में फिट होने की अनुमति देती है, मैं कहूंगा कि यह वास्तव में बहुत vi / vim है।
रोमेनियल

1

मुझे लगता है कि ऐसा करने के लिए मौजूदा तंत्र बेहतर हैं, लेकिन विजुअल ब्लॉक मोड का उपयोग करके ऐसा करना भी संभव है

दिनांक कॉपी करें:

gg          # Go to the top of the file
<ctrl>y     # Enter visual block mode
G           # Go to the bottom of the file
w           # Select the first word
"jy         # Copy in to the j register

पहली पंक्ति के अंत में पैड:

gg      # Top of file
A       # Append the line
        # Some spaces
<ESC>   # Return to command mode

पेस्ट करें:

gg 
# Move right to the length of the longest line
"jp   # Paste the block

ध्यान दें कि आप 4lइसके बजाय कर सकते हैंllll
एवरग्रीनट्री

@EvergreenTree - अपडेट किया गया।
साठफुटेरसूड

0

एक यूनिक्स कमांड लाइन से (या विंडोज़ यदि आपके पास यूनिक्स कमांड लाइन टूल स्थापित है)

sed -e "s/\(....\)\(.*\)/\1\2 \1" < inputFile > outputFile
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.