归纳常用的Vi/Vim 文本编辑技巧,便于以后查阅。
一、把空格替换为换行
:% s/ /\r/g
二、把空行删除
:g/^$/d
三、vim以16进制打开和编辑文件
先用vim以二进制格式打开需要编辑或查看的文件,不采用-b参数有时会导致转换错误。
vim -b file-to-open.dat
然后用xxd把文件转换成十六进制格式
:%!xxd
修改完成使用xxd把十六进制转换回二进制
:%!xxd -r
四、vim删除一列
光标放在列起始位置,然后CTRL+V, 移动光标到该列的末尾,按X键。删除多列时,向左/向右移动光标。
五、vim增加一列
(1) 定位光标;(2) CTRL+V;(3) j (nj 多行) ;(4) shift+I;(5) 输入文本;(6) ESC;
六、在两个文档间复制
(1)vi file_1 file_2 (2):sp 进入文档切换模式
(3):e file_x 打开多个文件 (4)CTRL+w 在 多个 文件 间切换
(5)在 file_1中 定位 光标,CTRL+v ,选择要复制的 内容,yy 复制 (6)在file_2中 选择同样 大小区域的内容,p 粘贴
(7)保存
七、多行复制、多行粘贴和多行删除
在命令模式下,将光标移动到将要复制的首行处,按“nyy”复制n行;其中n为1、2、3……
在命令模式下,将光标移动到将要粘贴的行处,按“p”进行粘贴
在命令模式下,将光标移动到将要删除的行处,按“ndd”删除n行;其中n为1、2、3……
八、窗口分屏
先打开一个文件:vi file1
在打开的界面中,在命令模式下,输入:vsp file2, 即可实现双文件打开,如果再打开一个文件,同样输入:vsp file3
在不同文件之间切换:ctrl + w w
九、文件比较
1. 使用vim的比较模式打开两个文件:
vim -d file1 file2
或
vimdiff file1 file2
2. 如果已经打开了文件file1,再打开另一个文件file2进行比较:
:vert diffsplit file2
如果没有用vert命令,diffsplit则会分上下两个窗口。
十、编辑窗口关闭而文件未保存
当使用vi或vim打开文件时,为了防止意外,比如用vi开启文件后,没有退出,又在另一个终端里再次用vi或vim打开同一个文件;或者没有退出vi编辑器就直接shutdown关机或init 0关机了。
就会产生一个以.swp为后缀的文件。如果这些意外没有发生,这个.swp文件将被删除。可用vi -r 文件名的方式恢复文件。然后用rm删除以.swp为后缀的文件
十一、如何在vim中插入一列递增数字
先在要插入这样递增数列的地方插入一个全文不会重复出现的字母序列,比如我插入的是ZCC,然后输入命令
:let i=0 | g/zcc/s//\=i/ | let i=i+1
十二、如何在固定pattern 后面增加新的 字符
例如 要在 所有 rand_gen_out_* 后面 加上 [8:0]
assign all_same = ((rand_gen_out_11==rand_gen_out_10)&&(rand_gen_out_10==rand_gen_out_9)&&(rand_gen_out_9==rand_gen_out_8)&&(rand_gen_out_8==rand_gen_out_7)&&
(rand_gen_out_7 ==rand_gen_out_6)&&(rand_gen_out_6 ==rand_gen_out_5)&&(rand_gen_out_5 ==rand_gen_out_4));
先选中要替换的字符所在行,然后使用命令:
:'<,'>s/\(rand_gen_out_[0-9]*\)/\1[8:0]/g
十三、撤销和反撤销
普通模式下 u 撤销 ctrl + r 反撤销
十四、统计查找字符串的数量
比如我有一个log文件,我文件里符合规则的字符是yes,我想查找这个abc.log文件中的yes字符数量,怎么查找呢,如下:
:%s/yes//gn
十五、将文件里面的所有十进制数转成十六进制数
:%s/\d\+/\=
printf
(
"0x%x"
, submatch(0))
十六、将 一行数据(数据间有空格) 转成 一列数据
(1) :%s # #\r#g
(2)sed 's/[ ][ ]*/\n/g
(3):%s #\s\+#r\r#g
十七、在固定字符后 插入 空格
:%s#\(\a\)\@<=#\=repeat(' ',5)#g