开发者

Linux CentOS7 vim重复行问题

目录
  • 一、出现重复行
    • 1.现象
    • 2.原因
    • 3.案例
  • 二、避免重复行
    • 1.知道原因
    • 2.操作注意
  • 三、删除重复行
    • 1.sort u
    • 2.%!uniq
    • 3.w !uniq > %
    • 4. sor ur /^/
    • 5.g/^\(js.\+\)$\n\1/d
  • 总结

    在用vim编辑处理文件时,会有重复行。有的是情境需要,有的可能是误操作而形成。对于正常形成的重复行,我们不作讨论,我们仅讨论什么情况下会出现重复行,如何避免,如何处理。

    在文件中的单行或多个连续空白行,我们不作处理。这可能是格式需要。

    一、出现重复行

    1.现象

    很多新手容易出现的现象:编辑vim后出现很多重复行

    2.原因

    原因也很简单,vim具有数字+命令的多次重复执行命令的功能,也就是说,允许数字+命令的语法格式,表示重复执行命令,其重复次数就是命令前的数字。

    如在命令模式下,5yy:从光标所在行开始且包括当前行,共复制5行;3dd:从光标所在行开始(含当前行),共删除3行;7p:在光标所在行后粘贴7次前面复制的内容。

    新手是如何操作,才造成的重复行呢?

    新手操作vim最容易犯的错误就是用vim打开文件就开始录入内容。不显示内容时就用鼠标点点点。

    当录入某些数字后,发现没有模式切换,就又按了i/I,或按了a/A。在编辑模式下,录入一些内容后,按Esc键返回命令模式。这时就会出现重复的多行内容(就是前面录入的内容)。

    3.案例

    我们对此过程进行模拟操作,重现此类现象。

    a.打开文件

    我们先准备一个文本文件test.txt:

    Linux CentOS7 vim重复行问题

    b.录入数字

    用vim test.txt打开文件,(在命令模式下)直接录入数字123(可以是小键盘录入,也可以是主键盘上的123,不影响后续结果)。

    c.切换模式

    再按i键,进入编辑模式

    d.录入内容

    移动光标,在abcde行www.devze.com下录入ABCD,按回车

    Linux CentOS7 vim重复行问题

    e.退出

    按EwrMNAsc,退出编辑模式,vim的文本内容将出现如下效果:

    Linux CentOS7 vim重复行问题

    文件中的其他部分内容不变!录入的内容本来希望一行“ABCD”,现在出现很多行(123行)。

    二、避免重复行

    1.知道原因

    了解vim模式的使用,在不同模式下操作不同的命令或内容。

    如果因操作不当,产生了重复行,可以返回到命令模式下,按u取消原来的操作。

    2.操作注意

    不在命令模式下录入数字,或录入数字后及时按Esc,取消刚才的操作。

    如确实需要部分内容重复,可以按此方法,产生需要的重复行。

    三、删除重复行

    删除重复行的操作十分普遍。

    如果找不到产生重复行的原因,或拷贝内容时产生了多余的重复行,将如何删除重复行呢?

    vim删除重复行方法很多,原理基本相同:先排序,再应用正则表达式查找相同行,并删除(特定条件下,不排序,直接去除重复行)。

    在后续的讨论中,我们需要一些重复行,将按前述介绍操作产生重复行。

    1.sort u

    sort命令应用比较多,具有排序功能。u是uniq去除重复命令的简写。

    : sort u

    Linux CentOS7 vim重复行问题

    命令执行后效果:

    Linux CentOS7 vim重复行问题

    此命令也可以再简化为sor[t] u,执行时可以不写t。

    2.%!uniq

    在前面删除重复行操作后,可以在命令模式下,按u,返回到有重复行状态。

    Linux CentOS7 vim重复行问题

    录入命令:

    : %!uniq

    Linux CentOS7 vim重复行问题

    效果如前,去除了重复行,仅保留一行内容。

    Linux CentOS7 vim重复行问题

    3.w !uniq > %

    再次按下u,返回到有重复行状态。

    执行命令(底行模式下):

    : w !uniq > %

    Linux CentOS7 vim重复行问题

    执行命令后,有两项选择,如下:

    Linux CentOS7 vim重复行问题

    选择 O,确认后,仍需按确认键继续。

    Linux CentOS7 vim重复行问题

    返回原来状态。

    选择 L,确认后,仍需按确认键继续,最终是删除重复行:

    Linux CentOS7 vim重复行问题

    4. sor ur /^/

    再次按下u,返回到有重复行状态。

    执行命令(底行模式下):

    : sor ur /^/

    效果与前面基本一致。最大的不同,是在去除重复行的同时,不打乱原来文件内容。

    Linux CentOS7 vim重复行问题

    在前面的命令中,不加/^/时,也可以排序、去重。但加上/^/将仅去重,不进行打乱文件内容而排序。

    如把命令修改为sor u /^/,结果也将是排序、去重。

    Linux CentOS7 vim重复行问题

    5.g/^\(.\+\)$\n\1/d

    再次按下u,返回到有重复行状态。

    执行命令(底行模式下):

    : g/^\(.\+\)$\n\1编程/d

    命令解释

    在命令g/^\(.\+\)$\n\1/d中:

    • g全局
    • ^行首
    • .\+此处有1到多个任意字符
    • \(\)用括号包起来形成第一个分组
    • $行尾
    • \n换行
    • \1反向引用第一个分组
    • /d删除

    Linux CentOS7 vim重复行问题

    本案例中,没有执行排序命令,直接执行去重命令:

    Linux CentOS7 vim重复行问题

    下面使用替换来删除所有重复行(仅保留第一行,同时删除后面的重复行)。这是该g//d方法的一种变体。

    : %s/^\(.*\)\(\n\1\)\+$/\1/

    Linux CentOS7 vim重复行问题

    去除重复行,仅保留一行!

    : %s/\v^(.*)(\n\1)+$/\1/

    Linux CentOS7 vim重复行问题

    去除重复行,仅保留一行!

    : %s/\(.\+\)$\n\1/\1/g

    Linux CentOS7 vim重复行问题

    不能一次去除重复行,可以多次执行,最后只保留一行。

    另外还有一些别的命令,也可以试一试:

    • :g/\%(^\1$\n\)\@<=\(.*\)$/d     //功能同上,也是去除重复行
    • :g/\%(^\1\>.*$\n\)\@<=\(\k\+\).*$/d  //功能同上,也是去除重复行

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多wrMNA多支持编程客栈(www.devze.com)。

    0

    上一篇:

    下一篇:

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    最新运维

    运维排行榜