Linux 查找、编辑及存盘
删除命令
删除字符
删除当前字符的命令 x
命令5x 删除从当前光标开始的5个字符
删除行
删除当前行的命令 dd
删除从当前行开始的3行命令 3dd
字符替换
替换光标处字符 r
将当前光标处字符替换为a:ra命令
连续替换多个字符
将当前光标处开始的三个字符依次替换为abc,则需要按命令rarbrc
亲测这种方式不可行,只会替换当前字符,如果想连续替换着需要按下shift键和r键,切换到REPLACE模式下才行。
取消和重复
取消上一次的编辑操作(undo) u
如:误删了一段正文,用u命令可撤销删除
如:把文件中的所有abc字符串替换成xyz字符串, 用u命令可撤销替换
重复上一次的编辑操作 圆点.
按圆点键,可以重复上一次的编辑操作
例如:按3dd命令删除了三行,然后按圆点键就再删除三行,接着连续按圆点键,则继续删除三行,每按一次删三行。
文件操作命令
存盘退出
ZZ
1 | [root@localhost vi]# cat helloworld.c |
:wq回车
存盘不退出
1 | :w<CR> |
这里的<CR>
表示Enter键
不存盘退出
1 | :q!<CR> |
当前行下插入文件内容
读入文件xyz.c插入到当前行之下1
:r xyz.c<CR>
示例
test.txt文件:1
2
3
4
5[root@localhost vi]# cat test.txt
test.txt line 1
test.txt line 2
test.txt line 3
[root@localhost vi]#
光标在第1行时,输入:r test.txt<CR>
后:
把当前文件的部分行写入文件
写文件,把第50行至文件尾的内容写到文件file1中1
:50,$w file1<CR>
强制覆,把第50行到行尾的内容强制覆盖到文件file1中:1
:50,$w! file1<CR>
剪贴板
删除,并拷贝到剪贴板
删除第10-50行:1
:10,50d<CR>
删除文件首至当前行的部分:1
:1,.d<CR>
删除当前行到文件尾1
:.,$d<CR>
不删除,拷贝到剪贴板(yank)
1 | :10,50y<CR> |
粘贴剪贴板信息(paste)
1 | p |
块操作:复制与删除
复制
复制第5-10行到第56行之下:1
:5,10co56<CR>
移动
移动第8-34行的内容到第78行的内容之下:1
:8,34m78<CR>
行合并、刷屏和状态显示
两行合并(Join):J(shiff+j)
需要注意的是这个J是大写的,也就是按shift+j进行输入,单独按j键是不会起效果的:
两行合并末行命令 :j
也可以使用在末行命令:1
:j
当前行下面的行合并到当前行
刷新屏幕显示(load) Ctrl-l
状态显示Ctrl-g
在屏幕最下面一行列出正在编辑的文件的名字,总行数,当前行号,文件是否被修改过等信息
模式查找
用“正则表达式”来描述一个字符串模式
查找命令格式
1 | /pattern |
例:1
/[0-9][0-9]*
vi好像只支持基本的正则表达式,扩展的正则表达式例如.+
并不支持。
其实不是而是.+
需要写成.\+
继续查找命令
n 向下查找下一个next
N 向上查找下一个
循环式搜索(向下搜索时遇到文件尾则回到文件头继续搜索)
模式替换
替换命令(substitution)
格式1
:n1,n2s/pattern/string/g
例1
:1,50s/abc/xyz/
1
:1,50s/abc/xyz/g
第50-75行右移4列:1
:50,80s/^/ /
第50-75行左移4列:1
:50,80s/^ //
消除尾部多余的空格1
:1,$s/ *$//
小心陷阱:不能把a[i]
替换为b[j]
1
:1,$s/a[i]/b[j]/g
小心陷阱:不能把a*b替换为x+y1
:1,$/a*b/x+y/g
模式替换中的转义符
尤其是编辑C语言源程序时需要
将a[i]*b[j]
替换为x[k]*y[n]
的命令1
:1,$s/a\[i]\*b\[j]/x[k]*y[n]/g
将buf.len/1000
替为buffer.size/1024
的命令1
:1,$s/buf\.len\/1000/buffer.size\/1024/g
模式串和替换字符串中的斜线前加转义符\
以区别于替换命令格式中所必须的斜线.
使用其他符号作为s替换末行命令的分隔符
1 | :1,$s:buf\.len/1000:buffer.size/1024:g |
s后面以冒号取代斜线,分界符就换为冒号,避免对斜线的转义1
:1,$s^http://www\.myvdo\.com/a/b/c/index\.html^https://www.xyvdo.com/index.html^g
分组:模式描述中增加(和)
在正则表达式中圆括号,仍然代表它自身
在正则表达式中出现的(和)不影响匹配操作
例1
2[a-zA-Z_][a-zA-Z0-9_]*->number
\([a-zA-Z_][a-zA-Z0-9_]*\)->number
反向引用:\0 \1 \2
将“变量名->number
”替换为“变量名->num
”1
:1,$s/\([a-zA-Z_][a-zA-Z0-9_]*\)->number/\1->num/g
将日期格式“月-日-年
”改为“年.月.日
”,
比如:将04-26-1997
替换为1997.04.26
使用命令:1
:1,$s/\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9]*\)/\3.\1.\2/g