Linux CentOS7 vim重复行

news/2024/7/21 6:29:31 标签: excel, linux, 运维, vim, 服务器, bash, python

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

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

一、出现重复行

1.现象

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

2.原因

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

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

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

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

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

3.案例

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

a.打开文件

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

b.录入数字

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

c.切换模式

再按i键,进入编辑模式

d.录入内容

移动光标,在abcde行下录入ABCD,按回车

e.退出

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

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

二、避免重复行

1.知道原因

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

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

2.操作注意

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

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

三、删除重复行

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

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

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

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

1.sort u

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

        : sort u

命令执行后效果:

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

2.%!uniq

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

录入命令:

        : %!uniq

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

3.w !uniq > %

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

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

        : w !uniq > %

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

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

返回原来状态。

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

4. sor ur /^/

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

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

        : sor ur /^/

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

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

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

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

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

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

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

命令解释

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

        g全局

        ^行首

        .\+此处有1到多个任意字符

        \(\)用括号包起来形成第一个分组

        $行尾

        \n换行

        \1反向引用第一个分组

        /d删除

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

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

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

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

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

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

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

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

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

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

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


http://www.niftyadmin.cn/n/5062850.html

相关文章

带头双向循环链表解析|画图理解

前言&#xff1a; 链表中常用的的两种结构就是无头单向非循环链表和带头双向循环链表&#xff0c;在前面我们已经学习了无头单向非循环链表&#xff0c;今天我们将学习带头双向循环链表。 1、链表的分类 实际中链表的结构非常多样&#xff0c;一下情况结合起来就有8种链表结构。…

【Java基础】抽象类和接口的使用

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【JavaSE_primary】 本专栏旨在分享学习JavaSE的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、抽象类抽象类概念…

想做网络安全但是没有任何证书可以吗

大家好&#xff0c;我是网络工程师成长日记实验室的郑老师&#xff0c;您现在正在查看的是网络工程师成长日记专栏&#xff0c;记录网络工程师日常生活的点点滴滴 有个同学说他打算做网络安全工程师。他问我说如果考这个软考的网络工程师或者信息安全这个工程师&#xff0c;到时…

CPU和指令周期

CPU包括&#xff1a; ❤️运算 1.算术逻辑单元 2.暂存寄存器 3.累加寄存器 4.通用寄存器 5.程序状态字寄存器 6.移位器 7.计数器 ❤️控制器 1.程序计数器&#xff08;PC&#xff09; 2.指令寄存器 &#xff08;IR&#xff09; 3.指令译码器 4.存储器地址寄存器 &#xff08;…

【EasyPoi】SpringBoot使用EasyPoi自定义模版导出Excel

EasyPoi 官方文档&#xff1a;http://doc.wupaas.com/docs/easypoi Excel模版导出 引入依赖 <dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency…

春招秋招,在线测评应用得越来越普及

这年代提到测评&#xff0c;很多人都比较熟悉&#xff0c;它有一种根据所选的问题给予合适答案方面的作用。因为不同的测评带来的影响不一样&#xff0c;所以很多人都会关注在线测评的内容有哪些。在校园招聘上面&#xff0c;在线测评也频繁出现了&#xff0c;这让很多人好奇它…

【LeetCode刷题笔记】一维数组

1.两数之和 解题思路&#xff1a; 哈希 &#xff0c;每次循环将 元素值 和对应 下标 放入 map 中&#xff0c;每次更新 map 之前先判断一下&#xff0c;如果 map 中已经包含 target - nums[i] 的 key &#xff0c;则找到答案&#xff0c;返回 当前下标 和之前的 key 对应的 下…

js生成随机16进制数

在JavaScript中&#xff0c;可以使用以下的代码来生成一个100位的随机十六进制数&#xff1a; function generateRandomHex(length) {var result ;var characters 0123456789abcdef;for (var i 0; i < length; i) {result characters.charAt(Math.floor(Math.random() …