给定一系列类似于以下内容的行:

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


评论

当然有::%g / ^ \ d \ {4} \ d \ @!/ s / ^ \(\ d \ {4} \)。* \ zs / \ 1 /。

#1 楼

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


是一种方法



\v魔术选项,以避免逃避分组()


^行首

\d{4}正好匹配四位数字

.*其余行

()内具有匹配的模式


编辑:@Jair Lopez在评论中提及,正则表达式可以进一步改进:

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


或等效的
/>
:% s/\v^(\d{4}).*/q4312078q / 




&q4312079q包含整个匹配的模式

为进一步阅读,vimregex和regex FAQ

评论


:%s / \ v ^(\ d {4})。* /&\ 1 /将是一个较短的命令。

–贾尔·洛佩斯(JairLópez)
16年5月1日在15:21

#2 楼

还有一个带有宏的解决方案:

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一样,只要有足够多的时间。 >
:%normal @q


您当然可以用描述要修改的行的范围替换%

评论


您也可以使用:%normal @q在每一行上执行它

– evilsoup
16年5月1日在9:03

@evilsoup:感谢您提及,我将编辑答案。

–statox♦
16年5月1日在9:19

#3 楼

这是我的处理方式:

:%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 q4312078q" "}'


评论


那么,不是vi / vim还是前四个字符。

–烟斗
16年5月1日在18:04



考虑到:help过滤器是Vim的内置功能,考虑到该功能允许Vim适应UNIX范式的程度,我会说实际上是vi / vim。

– romainl
16年5月1日在18:29

#5 楼

我认为执行此操作的现有机制更好,但是也可以使用可视块模式来执行此操作。

复制日期:

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
16年5月25日在21:40

@EvergreenTree-更新。

–sixtyfootersdude
16年5月25日在21:58

#6 楼

从UNIX命令行(或Windows(如果已安装UNIX命令行工具))

sed -e "s/\(....\)\(.*\)/ " < inputFile > outputFile