vi高级命令集锦

1.交换两个字符位置
xp
2.上下两行调换
ddp
3.把文件内容反转
:g/^/m0/ (未通过)

4.上下两行合并 
J
5.删除所有行 
dG
6.从当前位置删除到行尾
d$
7.从当前位置复制到行尾
y$ 如果要粘贴到其他地方 p 就可以了


由于vi 是建立在 EX 上的 所以 当键入 : 时就来到了 EX 命令状态 
8.
:ab string strings 
例如 ":ab usa United States of America" ,
当你在文见里插入 usa 时 
United States of America 就蹦出来了
9.
:map keys new_seq 
定义你当前 键盘命令 
10.
:set [all] 
vi or ex 的编辑状态
如 显示每行 :set nu 
11.
在命令状态下,nyy表示拷贝从光标行起的下n行内容,p表示paste,可刚复制的内容粘贴在光标处的
下面。 

12.
单个字符替换用r,覆盖多个字符用R,用多个字符替换一个字符用s,整行替换用S 

13.

s/old_word/new_word/g
这个指令是于在整个文件中替换特定字符串 

14.光标控制

k:上移 nk 上移n行
j:下移 nj 下移n行


将光标移到第n行,按下 mk
将光标移到第m行,按下 "ay'k
即将第n到m的行存到a寄存器,以此类推,b,c........寄存器等

这样就可以将你常用的需要复用的内容粘贴到不同的寄存器中以备用


想粘贴到某处,直接将光标移到某地,按下 'ap 即可,以此类推,b,c........寄存器等

在当前屏幕中
H 跳到第一行
M 跳到中间一行
L 跳到最后一行 

15.
表8-2 删除命令
删除命令操作
d l 删除当前字符(与x命令功能相同)
d 0 删除到某一行的开始位置
d ^ 删除到某一行的第一个字符位置(不包括空格或TA B字符)
d w 删除到某个单词的结尾位置
d 3 w 删除到第三个单词的结尾位置
d b 删除到某个单词的开始位置
d W 删除到某个以空格作为分隔符的单词的结尾位置
d B 删除到某个以空格作为分隔符的单词的开始位置
d 7 B 删除到前面7个以空格作为分隔符的单词的开始位置
d) 删除到某个语句的结尾位置
d 4) 删除到第四个语句的结尾位置
d( 删除到某个语句的开始位置
d } 删除到某个段落的结尾位置
d { 删除到某个段落的开始位置
d 7 { 删除到当前段落起始位置之前的第7个段落位置
d d 删除当前行
d /t e x t 删除从文本中出现" t e x t"中所指定字样的位置,一直向前直到下一个该字样所出现的
位置(但不包括该字样)之间的内容
d fc 删除从文本中出现字符"c"的位置,一直向前直到下一个该字符所出现的位置(包括
该字符)之间的内容
d tc 删除当前行直到下一个字符" c"所出现位置之间的内容
D 删除到某一行的结尾
d $ 删除到某一行的结尾
5 d d 删除从当前行所开始的5行内容
d L 删除直到屏幕上最后一行的内容
d H 删除直到屏幕上第一行的内容
d G 删除直到工作缓存区结尾的内容
d 1 G 删除直到工作缓存区开始的内容

修改命令操作
c l 更改当前字符
c w 修改到某个单词的结尾位置
c 3 w 修改到第三个单词的结尾位置
c b 修改到某个单词的开始位置
c W 修改到某个以空格作为分隔符的单词的结尾位置
c B 修改到某个以空格作为分隔符的单词的开始位置
c 7 B 修改到前面7个以空格作为分隔符的单词的开始位置
c 0 修改到某行的结尾位置
c) 修改到某个语句的结尾位置
c 4) 修改到第四个语句的结尾位置
c( 修改到某个语句的开始位置
c } 修改到某个段落的结尾位置
c { 修改到某个段落的开始位置
c 7 { 修改到当前段落起始位置之前的第7个段落位置
c tc 修改当前行直到下一个字符c所出现位置之间的内容
C 修改到某一行的结尾
c c 修改当前行
5 c c 修改从当前行所开始的5行内容


.重复上一次修改! 


表8-4 替换命令
替换命令操作
s 将当前字符替换为一个或多个字符
S 将当前行替换为一个或多个字符
5 s 将从当前字符开始的5个字符替换为一个或多个字符


vi替换使用规则:
:g/s1/s/s2/s3/g
第一个g表示对每一个包括s1的行都进行替换,第二个g表示对每一行包括s1的行所有的s2都用s3替换
s表示替换,s2是要被替换的字符串,他可以和s1相同(如果相同的话用//代替),s3是替换字符串 


16.

fx
往右移动到 x 字符上
Fx
往左移动到 x 字符上
tx
往右移动到 x 字符前
Tx
往左移动到 x 字符后
(注意:以上四个命令中,其中x是键入的字符)
;
分号,配合 f 和 t 使用,重复一次 
,
逗号,配合 f 和 t 使用,反方向重复一次


17. vi 环境选项 Solaris ksh

noautoindent nomodelines noshowmode
autoprint nonumber noslowopen
noautowrite nonovice tabstop=8
nobeautify nooptimize taglength=0
directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
noedcompatible prompt tagstack
noerrorbells noreadonly term=vt100
noexrc redraw noterse
flash remap timeout
hardtabs=8 report=5 ttytype=vt100
noignorecase scroll=11 warn
nolisp sections=NHSHH HUuhsh+c window=23
nolist shell=/bin/ksh wrapscan
magic shiftwidth=8 wrapmargin=0
mesg noshowmatch nowriteany


For C-Shell:
setenv EXINIT "set nu"
For Bourne or Korn Shell:
EXINIT="set nu"; export EXINIT 
For Korn Shell Only (alternate method): 
typeset -x EXINIT="set nu"
在 .profile 里设置 vi 的环境选项 , 以上均测试过 


18.标记文本

  mchar   用字母char标记当前光标的位置
  `char   移至char所标记处
  'char   移至char标记所在行的开头处
  "     移至当前行上一次所在位置(在光标移动之后)――一个双引号
  ''    移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号


19.
同时vi多个文件时,CTRL-SHIFT-6回到上一个文件,在本次vi的文件和上次vi的文件之间切换。
但是我发现一个BUG:在用CTRL-SHIFT-6切换到上一个文件后,用:args查看多文件vi状态时,
屏幕底部仍然显示目前vi的是刚才的文件。
(在HP-UX,Solaris,AIX上通过)

也可以使用:
:e#
进行切换

20.
sco 下VI 要在文本前同样的字符加用
%s/^/要加的内容/g 要在文本后同样的字符加
%s/$/要加的内容/g 

21.
如何去掉文本中的 ^M 硬回车?不必用binary传回去再ascii传回来的方式,用shell或者unix语句实现。

cat filename |tr -d '15' >newfile
不同的unix系统还存在一些其他不同的命令,如:doscp 
sed 也可以实现这个功能. 

dos2unix filename filename2
反之
unix2dos filename filename2 

在vi 中用:$s/^M//g
^是crtl-V crtl-M 


22.如何在"unix命令行"下将一个文件的某字符串用另一个串换掉

sed 's/string1/string2/gp' file1 > file2


23.将/etc/hosts下所有的地址都ping 2次

1 #/usr/bin/sh
2 #grad /etc/hosts and ping each address
3 cat /etc/hosts|grep -v '^#' | while read LINE
4 do
5 ADDR=`awk '{print $1}'`
6 for MACHINE in $ADDR
7 do
8 ping $MACHINE -n 2
9 done
10 done

24

到前一个函数[[ ,到下一个函数]] ,括号配对% ,交叉参考Ctrl_] (事先用ctags做索引),回来用e# ` 编辑一个函数:vi -t 函数名 ,编辑加密文本vi -X

25
在插入模式下ctrl+p,自动补齐剩余单词,以赖规则:tags,以有的单词等等


Vi的替换命令: 
:ranges/pat1/pat2/g 
其中 
: 这是Vi的命令执行界面。 
range 是命令执行范围的指定,可以使用百分号(%)表示所有行,使用点(.)表示当前行,使用美元符号($)表示最后一行。你还可以使用行号,例如10,20表示第10到20行,.,$表示当前行到最后一行,.+2,$-5表示当前行后两行直到全文的倒数第五行,等等。 
s 表示其后是一个替换命令。

pat1 这是要查找的一个正则表达式,这篇文章中有一大堆例子。

pat2 这是希望把匹配串变成的模式的正则表达式,这篇文章中有一大堆例子。 
g 可选标志,带这个标志表示替换将针对行中每个匹配的串进行,否则则只替换行中第一个匹配串。
1. 文件加密 :X
然后系统会提示输入密码,输入密码后存盘退出。
下次编辑时请使用vi -x filename 打开被加密的文件。
2. 上下两行合并 J
删除所有行 dG
交换两个字符位置xp
上下两行调换ddp
注:xp 和ddp 应该理解为删除一个字符(x)和删除一行(dd),然后在p(paste),这样便不需
记新命令了.
3. 从当前位置删除到行尾d$
从当前位置复制到行尾y$
如果要粘贴到其他地方 p 就可以了
4.文件移动
:line1,line2mline3: 将line1--line2 之间的内容移到line3 下 相当于word 的剪切,
:line1,line2tline3: 将line1--line2 之间的内容粘贴到line3 下,相当于word 的粘贴。
:n1,n2w filename:把行N1-N2 之间内容写入新文件filename 中。
5.自动添加字符串 :ab string strings
例如 ":ab usa United States of America" 。
当你在文件里插入 usa 时 ,United States of America 就蹦出来了
6. 替换命令操作 :g/s1/s/s2/s3/g
第一个g 表示对每一个包括s1 的行都进行替换,第二个g 表示对每一个包括s1 的行的
所有的s2 都用s3 替换,s 表示替换,s2 是要被替换的字符串,他可以和s1 相同(如果相同
的话用//代替),s3 是替换字符串
注:在整个文件中替换特定字符串 :%s/old_word/new_word/g
7. 寄存器操作
"?nyy:将当前行及其下n 行的内容保存到寄存器?中,其中?为一个字母,n 为一个数
"?nyw:将当前行及其下n 个字保存到寄存器?中,其中?为一个字母,n 为一个数字
"?nyl:将当前行及其下n 个字符保存到寄存器?中,其中?为一个字母,n 为一个数字
"?p:取出寄存器?中的内容并将其放到光标位置处。这里?可以是一个字母,也可以是
一个数字
ndd:将当前行及其下共n 行文本删除,并将所删内容放到1 号删除寄存器中。
注:vi 还有有编号的删除缓冲区。撤消命令只能恢复上一次的删除,当且仅当这个删除
是最后一次操作。但是,vi 可以把最近9 次删除的内容都放入9 个编号从1 到9 的缓冲区内。
最近一次删除保存在缓冲区1,次近的在缓冲区2,依此类推。例如,"2p 可以放置第二个
删除缓冲区中的内容。
8. 排序
如有一文件,内容为:
333
222
334
444
111
553
554
233
运行命令:%!sort 文件内容为:
111
222
233
333
334
444
553
554
9vi 环境选项
noautoindent nomodelines noshowmode
autoprint nonumber noslowopen
noautowrite nonovice tabstop=8
nobeautify nooptimize taglength=0
directory=/var/tmp paragraphs=IPLPPPQPP LIpplpipnpbtags=tags /usr/lib/tags
noedcompatible prompt tagstack
noerrorbells noreadonly term=vt100
noexrc redraw noterse
flash remap timeout
hardtabs=8 report=5 ttytype=vt100
noignorecase scroll=11 warn
nolisp sections=NHSHH HUuhsh+c window=23
nolist shell=/bin/ksh wrapscan
magic shiftwidth=8 wrapmargin=0
mesg noshowmatch nowriteany
For C-Shell:
setenv EXINIT "set nu"
For Bourne or Korn Shell:
EXINIT="set nu"; export EXINIT
For Korn Shell Only (alternate method):
typeset -x EXINIT="set nu"
在 .profile 里设置 vi 的环境选项 , 以上均测试过
10. 重复上一次操作 .:
恢复上一次的操作 u
11. :! shell-command 执行SHELL 命令的操作
举例
1.删除文件中的几行
到删除的开始处 ma
到删除的结束处 d’a
2.拷贝文件中的几行
到拷贝的开始处 ma
到拷贝的结束处 y’a
3.替换文件中所有匹配的字符
替换文件中的 lesson 为course
s/lesson/course/g
注意:可能替换含有lesson 的其他词
4.替换文件中一个区域的字符
start_line, end_line %s/lesson/course/g 或者
采用宏的方式
‘a,. %s/lesson/course/g #需要定义宏;’.’是指光标所在行
5.替换一个文件中某些词
比如替换none 为nothing
查找 /none
替换 cw,输入nothing,按键盘Esc
继续查找 n
替换 .
6.重复执行一个shell 命令
编译一个程序
保存编辑后的文件 :w
编译文件 :!make
修改文件后,在保存 :w
再编译 :!!
7.在两个文件互拷贝
第一种方法:
编辑源文件 vi source_file
到拷贝的部分开始处 ma
到拷贝的部分结束处 :.,’a w tempfile
退出当前文件 :q
编辑目的文件 vi dest_file
到拷贝的地方 :r tempfile
第二种方法:
编辑源文件 vi source_file
到拷贝的部分开始处 ma
到拷贝的部分结束处 “ay’a
不退出源文件编辑目的文件 :e dest_file
到拷贝的地方 “ap
原文地址:https://www.cnblogs.com/tychyg/p/5068862.html