我有一个从旧数据库中生成的文本文件,每个字段一行,除了知道有多少个字段之外,记录之间没有交集。我想做的是连接前N行,然后连接下N行,依此类推。在Vim中有什么方法可以做到这一点吗?有没有一种方法可以选择行来基于任意的VimL表达式(如line(".")%5==0)而不仅仅是正则表达式来应用命令?
line(".")%5==0
1szpjjfi1#
有多种方法可以解决这个问题。首先,我想到的是记录一个宏,比如在寄存器w中:
w
qw5Jjq
字符串这基本上使用了J普通命令来连接5行并向下移动一行。然后您可以使用简单的20@w重复该宏20次,或者使用@@继续重复。另一种可能更“正确”的方法是使用:join ex命令,它与J普通命令相同,但可以缩写为:j,并与:g结合使用,以在各行中操作。例如:
J
20@w
@@
:join
:j
:g
:g/./j5
型这将匹配每一行非空行,并在每一行中加入下5行(包括)。然后移动到下一行并加入更多的5行,依此类推。
iqjalb3h2#
它可以用两个简单的正则表达式来完成:
:%s/\(\(^.*\n\)\{5}\)/\1\r/g
字符串这一个只是把一个return每5行,其次是:
return
:%s/\(\n\{2}\)\|\n/\1/g
型或
:%s/\n\{2}\zs\|\n//g
型这只删除了1个return字符,而不是2个连续的字符
2条答案
按热度按时间1szpjjfi1#
有多种方法可以解决这个问题。首先,我想到的是记录一个宏,比如在寄存器
w
中:字符串
这基本上使用了
J
普通命令来连接5行并向下移动一行。然后您可以使用简单的20@w
重复该宏20次,或者使用@@
继续重复。另一种可能更“正确”的方法是使用
:join
ex命令,它与J
普通命令相同,但可以缩写为:j
,并与:g
结合使用,以在各行中操作。例如:型
这将匹配每一行非空行,并在每一行中加入下5行(包括)。然后移动到下一行并加入更多的5行,依此类推。
iqjalb3h2#
它可以用两个简单的正则表达式来完成:
字符串
这一个只是把一个
return
每5行,其次是:型
或
型
这只删除了1个
return
字符,而不是2个连续的字符