html tool

2021年11月14日星期日

vim 每指定行数执行一次

问题:

如下文档:

     1 "00003d18b58ae0e60a567ca9956e43993de2c49965e423e9fa9719d887a10c95",

     2 "0000aa3782882660e71d3f12df57534ba469d331d6d8bfcb7e1a5875c8cd3de1",

     3 "0000cd1b059df91f5bfd78d8af3b3b1faae2053e5aaa11954e16ddf7213d0d19",

     4 "0000de0fa08182bb32e022ac604c606eb2232fa67707ab4d714aa29b7464e47f",

     5 "00017d9f09b6ccd1d7d5cf3da378ae4a0fd7a01330f58ac7a77d3f036ab7484c",

     6 "000184348abf5ea9d22e74316aa3472f3b067161faa7b1b4e89e82e97bdf8e92",

     7 "00025afd4206e67839b47f962206b52129e788cbbddccf4c92d3c340f9b90685",

     8 "0002fb8ff23699c461764694084c4cf84284e9c082290bf1b2cff2c168a38939",

     9 "0003c0b80757b2c785ba7e0a5328046185d199927ec3704b67a77b93281dbd90",

     ....

预期结果:
 1 "00003d18b58ae0e60a567ca9956e43993de2c49965e423e9fa9719d887a10c95","0000aa3782882660e71d3f12df57534ba469d331d6d8bfcb7e1a5875c8cd3de1", "0000cd1b059df91f5bfd78d8af3b3b1faae2053e5aaa11954e16ddf7213d0d19", "0000de0fa08182bb32e022ac604c606eb2232fa67707ab4d714aa29b7464e47f",
     2 "00017d9f09b6ccd1d7d5cf3da378ae4a0fd7a01330f58ac7a77d3f036ab7484c","000184348abf5ea9d22e74316aa3472f3b067161faa7b1b4e89e82e97bdf8e92", "00025afd4206e67839b47f962206b52129e788cbbddccf4c92d3c340f9b90685", "0002fb8ff23699c461764694084c4cf84284e9c082290bf1b2cff2c168a38939",
     3 "0003c0b80757b2c785ba7e0a5328046185d199927ec3704b67a77b93281dbd90","0003c80cb6944678655dc3d7b4c9d9d67cb2e4890bac2cf9f46d800e306ad25e", "0003f568ed62793761546f5402e116bc8ddbde660f579f6ac658fc0bbbfecb70", "00051309018d432f62a2f6379126132237f662492b657b19bf70b3fae4493810",
   ....
 

解决方式:

:g/^/ s/\n//|j|j


解释:

:g/^/ 可以理解为 在当前整个文档中执行 之后的 命令,这里是s/\n// ;而 | 用来分割命令,用于在一个行中同时输入多个命令,当前是向下移动一行再移动一行,是两行,这样下次替换时,开始标记的位置是4行之后;这里按需要的行数可以加 n个 |j

这里有个注意:不可以写成:g/^/ s/\n//|2j 或者 :g/^/ s/\n//|jj 

vim执行会递归死掉,自己也没有搞明白原因,先mark一下吧


Vim在实际执行 global 命令时,会先查找所有匹配 {pattern} 的行,并对匹配结果进行标记,最后对每一个标记的行执行 Ex 命令


参考:https://vimjc.com/vim-extract-odd-or-even-line.html

没有评论:

发表评论