Bagaimana cara menyalin empat karakter pertama dari setiap baris ke akhir baris yang sama?


10

Diberikan serangkaian garis yang terlihat mirip dengan ini:

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.

Apakah ada cara agar saya dapat mengambil empat karakter pertama (tahun), dan menyalinnya ke akhir baris, sehingga terlihat seperti ini:

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

Jawaban:


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

adalah salah satu cara untuk melakukannya

  • \v Opsi ajaib, untuk menghindari keharusan menghindari pengelompokan ()
  • ^ mulai dari garis
  • \d{4} cocok persis empat digit
  • .* sisa baris
  • \1 \2 memiliki pola yang cocok di dalamnya ()

sunting: @Jair Lopez menyebutkan dalam komentar, ekspresi reguler dapat lebih ditingkatkan:

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

atau yang setara

:% s/\v^(\d{4}).*/\0 \1/ 
  • &dan \0berisi seluruh pola yang cocok

Untuk membaca lebih lanjut, vimregex dan regex FAQ


3
:%s/\v^(\d{4}).*/& \1/akan menjadi perintah yang lebih pendek.
Jair López

10

Dan solusi dengan makro:

qqyiwA <Esc>pj0q

Yang berarti:

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

Anda kemudian dapat memutar ulang makro sebanyak waktu yang Anda miliki 3@a.

Sunting Seperti @evilsoup menyebutkannya di komentar, cara yang lebih efektif untuk mengeksekusi makro pada semua baris buffer adalah dengan menggunakan:

:%normal @q

Tentu saja Anda dapat mengganti %dengan rentang yang menjelaskan garis yang akan dimodifikasi.


3
Anda juga dapat menjalankannya di setiap baris dengan:%normal @q
evilsoup

@ evilsoup: Terima kasih telah menyebutkan itu, saya akan mengedit jawabannya.
statox

6

Inilah cara yang akan saya lakukan:

:%norm y4lA <C-o>p

Penjelasan:

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

Jika Anda memiliki akses ke perintah UNIX standar, Anda dapat menggunakan AWK:

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

Maka tidak benar-benar vi / vim, atau empat karakter pertama.
pipa

1
Menimbang :help filteradalah fitur Vim built-in dan mempertimbangkan seberapa baik fitur tersebut memungkinkan Vim masuk dalam paradigma UNIX, saya akan mengatakan itu sangat vi / vim.
romainl

1

Saya pikir mekanisme yang ada untuk melakukan ini lebih baik, tetapi juga dimungkinkan untuk melakukan ini menggunakan mode blok visual .

Salin tanggal:

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

Pad akhir baris pertama:

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

Tempel:

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

Perhatikan bahwa Anda bisa melakukannya 4lalih - alihllll
EvergreenTree

@EvergreenTree - Diperbarui.
sixtyfootersdude

0

Dari baris perintah unix (atau windows jika Anda menginstal alat baris perintah unix)

sed -e "s/\(....\)\(.*\)/\1\2 \1" < inputFile > outputFile
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.