文件中每一行都保存为一个以行号作为文件名的独立文件中
如果一个文件包含有许多文本行,而每一行都是有意义的信息记录。本技巧演示如何把每一行都保存到一个独立文件中(每个文件仅保存一行)。
下面的命令会把当前缓冲区中的每一行都保存到一个单独的文件中:
:g/^/execute '.w '.line('.').'.txt'
第一行保存在文件 1.txt
中,第二行保存在文件 2.txt
中,如此类推。如果某个文件已经存在,那么不会被覆盖。该命令会提示错误信息,并停止执行,从而不会试图进行后续的文件保存动作。如果想要覆盖,把 .w
替换为 .w!
以强制文件覆盖。
以下命令与上面相似,但是它只会保存非空行(空行会跳过):
:g/./execute '.w '.line('.').'.txt'
命令解析:
:g/^/...
该 global
命令会在匹配到 ^
模式的每一行都执行一个命令(这里以 ...
表示)。由于该模式会匹配到行首,因此每一行都会匹配到,从而对每一行都会执行以 ...
表示的命令。
execute ...
这会计算以下表达式,并把计算的结果当成一个命令执行。
.w
其中:w
是写(保存)命令,而 .
是一个范围,其引用当前行,因此,该命令只会对当前行进行写操作。
line('.').'.txt'
line('.')
函数得到当前行的行号,并与字符串 .txt
进行拼接。
对于第一行,:g/^/
会执行命令 execute '.w 1.txt'
,其结果是把当前行(即第一行)写到文件 1.txt
中。
如果只想操作其中的一些行,则可以使用合适的搜索模式。例如,以下命令会操作以 Error
开头的所有行。在匹配到的每种情况下,三行(Error
前面的行,含有Error
的行,和后面的行)会同时保存到以 N.txt
命名的文件中,而 N
表示包含 Error
行的行号。
:g/^Error/execute '.-1,.+1w '.line('.').'.txt'