วิธีคัดลอกสี่อักขระแรกของทุกบรรทัดไปยังจุดสิ้นสุดของบรรทัดเดียวกันได้อย่างไร


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/แน่ใจว่ามี:
Sato Katsura

คำตอบ:


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

เป็นวิธีหนึ่งที่จะทำ

  • \v ตัวเลือกมายากลเพื่อหลีกเลี่ยงการหลบหนีการจัดกลุ่ม ()
  • ^ จุดเริ่มต้นของบรรทัด
  • \d{4} ตรงกับตัวเลขสี่หลัก
  • .* สายที่เหลือ
  • \1 \2 มีรูปแบบที่ตรงกันภายใน ()

แก้ไข: @Jair Lopez กล่าวถึงในความคิดเห็นการแสดงออกปกติสามารถปรับปรุงเพิ่มเติม:

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

หรือเทียบเท่า

:% s/\v^(\d{4}).*/\0 \1/ 
  • &และ\0มีรูปแบบที่ตรงกันทั้งหมด

สำหรับการอ่านเพิ่มเติมvimregexและคำถามที่พบบ่อย regex


3
:%s/\v^(\d{4}).*/& \1/จะเป็นคำสั่งที่สั้นกว่า
Jair López

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 ที่มีอยู่ภายในและการพิจารณาว่าฟีเจอร์นั้นจะช่วยให้ Vim เหมาะสมกับกระบวนทัศน์ UNIX ได้หรือไม่
romainl

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

@EvergreenTree - อัปเดต
sixtyfootersdude

0

จากบรรทัดคำสั่ง unix (หรือ windows หากคุณติดตั้งเครื่องมือบรรทัดคำสั่ง unix)

sed -e "s/\(....\)\(.*\)/\1\2 \1" < inputFile > outputFile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.