Her satırın ilk dört karakterini aynı satırın sonuna nasıl kopyalarım?


10

Buna benzeyen bir dizi satır verildiğinde:

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.

İlk dört karakteri (yıl) alıp satırın sonuna kopyalayabilmemin bir yolu var mı, böylece şöyle görünüyor:

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
Tabii vardır: :%g/^\d\{4}\d\@!/s/^\(\d\{4}\).*\zs/ \1/.
Sato Katsura

Yanıtlar:


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

bunu yapmanın bir yolu

  • \v sihirli seçenek, gruplama kaçmak zorunda kalmamak için ()
  • ^ satır başı
  • \d{4} tam olarak dört basamağı eşleştir
  • .* kalan satır
  • \1 \2 içinde eşleşen desen var ()

edit: @Jair Lopez yorumlarda bahsediyor, düzenli ifade daha da geliştirilebilir:

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

veya eşdeğeri

:% s/\v^(\d{4}).*/\0 \1/ 
  • &ve \0eşleşen tüm deseni içerir

Daha fazla okuma için vimregex ve regex hakkında SSS


3
:%s/\v^(\d{4}).*/& \1/daha kısa bir komut olurdu.
Jair López

10

Ve makro içeren bir çözüm:

qqyiwA <Esc>pj0q

Bunun anlamı:

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

Daha sonra makroyu, çizginiz olduğu kadar tekrar oynatabilirsiniz 3@a.

Düzenle @evilsoup yorumlarda belirtildiği gibi, arabellek tüm satırlarında makro yürütmek için daha etkili bir yol kullanmaktır:

:%normal @q

Elbette, değiştirilecek çizgileri tanımlayan %bir aralıkla değiştirebilirsiniz.


3
Ayrıca her satırda da :%normal @q
uygulayabilirsiniz

@evilsoup: Bahsettiğiniz için teşekkürler, cevabı düzenleyeceğim.
statox

6

İşte bunu yapmanın yolu:

:%norm y4lA <C-o>p

Açıklama:

:%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

Standart UNIX komutlarına erişiminiz varsa şunları kullanabilirsiniz AWK:

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

Gerçekten vi / vim, ya da ilk dört karakter değil.
boru

1
Yerleşik :help filterbir Vim özelliği olduğunu düşünürsek ve bu özelliğin Vim'in UNIX paradigmasına uymasını ne kadar iyi sağladığı göz önüne alındığında, aslında çok vi / vim olduğunu söyleyebilirim.
romainl

1

Bunu yapmak için mevcut mekanizmaların daha iyi olduğunu düşünüyorum, ancak görsel blok modunu kullanarak bunu yapmak da mümkün .

Tarihleri ​​kopyalayın:

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

İlk satırın sonunu doldurun:

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

Yapıştırmak:

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

4lBunun yerine şunları yapabileceğinizi unutmayınllll
EvergreenTree

@EvergreenTree - Güncellendi.
sixtyfootersdude

0

Bir unix komut satırından (veya yüklü unix komut satırı araçlarınız varsa pencerelerden)

sed -e "s/\(....\)\(.*\)/\1\2 \1" < inputFile > outputFile
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.