vim 技巧:g命令处理空行问题
Posted 程序工匠坊
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了vim 技巧:g命令处理空行问题相关的知识,希望对你有一定的参考价值。
vim 的 :g(lobal) 命令的工作方式有点类似 sed。但对于也不会用 sed 的童学,这句话可能让他更迷惑了。所以直接说用法吧。
1. 单模式用法
:g/模式/ :ex命令
其中 /模式/ 是 vim 支持的正则表达式,凡是匹配该模式的行,将执行其后的 :ex 命令。:ex 前面的冒号不是必须,因为它已经是在命令行模式下了;冒号前的空格也不是必须,只为阅读方便,显示它分为两部分。:g 前面的冒号表示从普通模式进入命令行模式时需要按这个冒号。
例如删除当前 buff(文件)内所有空行:
:g/^$/ delete
2. 双模式用法
:g/起始模式/,/终止模式/ :ex命令
当 :g 命令之后接两个模式后,就表示从匹配起始模式的行开始,直到匹配终止模式的行为止,对该范围内的行执行 :ex 命令。然后再搜索下段匹配起始到终止模式的区间行,再次执行 :ex 命令,直到遍历完整个文件的所有行。
例如,要将连续空行缩减为一个空行。不能简单地用上例命令,因为它会把唯一的空行也删除掉。这需求是要保留一行空行(实践中常用空行表示段落分隔)。用以下命令可达到要求:
:g/^$/,/./ -j
解释一下,/^$/ 表示搜索空行,/./ 表示搜索非空行,于是 /^$/,/./ 一起界定了一段连续空行的区间,但是包含最后一行是非空行。j 其实是 :join 命令的缩写,表示合并这些行(效果与普通模式下的 J 命令类似)。但是如果把最后一行非空行也合并进来的话,就删去其间的所有空行的。所以 -j 就表示 :join 命令前面还有个 -1(数字1可省略),表示区间范围的尾行上移一行,那就排除了最后一个非空行。最终效果就是将所有(连续)空行合并为一个空行。
于是就有这样一个需求,将一个段落内所有行合并为一行,每个段落按规范由一个空行分隔。这在 vim 中同样可用一个命令达成:
:g/./,/^$/ -j
该命令具体解释略,请参与上例,并且区别恰好是起始模式与终止模式互换,竟然就实现了两个差异极大的实用需求。
3. 有限全局范围
:m,n g/模式/ :ex命令
:'<,'> g/模式/ :ex命令
以上是关于vim 技巧:g命令处理空行问题的主要内容,如果未能解决你的问题,请参考以下文章