vi快捷键必知必会

先补充几个linux命令终端界面的快捷键


ctrl+a:移动光标到命令行首

ctrl+e:移动光标到命令行尾

ctrl+z:将进程放入后台

              使用bg或者fg命令可以将其调出来

不过,由Ctrl + z转入后台运行的进程在当前用户退出后就会终止,所以用这个不如用nohup命令,或者&,

因为nohup命令的作用就是用户退出之后进程仍然继续运行,而现在许多脚本和命令都要求在root退出时仍然有效。


ctrl + c: 终止命令

ctrl + d: 退出shell,logout


ctrl + l: 清除屏幕内容,效果等同于clear

ctrl + y: 粘贴刚才所删除的字符

           此命令比较强悍,删除的字符有可能是几个字符串,但极有可能是一行命令。

ctrl + r :在历史命令中查找 (这个非常好用,输入关键字就调出以前的命令了)

          这个命令我强烈推荐,有时history比较多时,想找一个比较复杂的,直接在这里,shell会自动查找并调用,方便极了


ctrl+p:显示上一条命令,↑

ctrl+n: 显示下一条命令,↓


!! 重复执行最后一条命令

!$ 显示系统最近的一条参数

比如我先用cat /etc/sysconfig/network-scripts/ifconfig-eth0,然后我想用vim编辑。

一般的做法是先用↑ 显示最后一条命令,然后用Home移动到命令最前,删除cat,然后再输入vim命令。

其实完全可以用vim !$来代替。

ctrl+alt+F1~F7:切换终端

 

把当前进程送到後台处理。


------------------------------------开始VI---------------------------------------

i:向光标处插入

a:向光标处右移一个字符插入

o:向光标处下移一行插入

x:删除当前光标一个字符

X:删除当前光标左面一个字符

----------------------------

dd:删除当前光标所在的一行数据

yy:复制光标所在的行数据

p:在当前光标的下一行粘贴数据

P:在当前光标的上一行粘贴数据

---------------------------------

0:按零,移动到当前行的行首(当前屏幕范围内)

shift+$:移动到当前行的行尾(当前屏幕范围内)

ctrl+( :光标移动到当前段的行首

ctrl+) :光标移动到当前段的行尾

shift+h :光标移动到文档首端(当前屏幕范围内)

shift+g :光标移动到文档末端(整篇文档)

-------------------------------------

ctrl+v :进入列块可视化操作模式(这是vim的命令。root用户下的vi无此操作,普通用户下的vi有此操作)

  进入该模式后,可以进行列块操作

  如:注释很多列

   首先ctrl+v

   然后使用shift+g选择一列数据,或者用 "j" 或者用 "箭头"来选择需要的列

   再后shift+i

   在当前光标下敲入#

   Esc

   发现刚才选定的行都被注释掉了。

  解除注释:

    首先ctrl+v

    然后shift+h选定刚才被注释掉的行

    敲入x

    发现注释全部解除了。

-------------------------------------------------------------

改变大小写:

大写变小写

ctrl+v,然后移动L键选中要改变大写为小写的字段,按小u键即可

小写变大写

ctrl+v,然后移动L键选中要改变小写为大写的字段,按大U键即可

--------------------------------------------------

ctrl+z:将当前vi打开文件放到后台

fg:将刚放入后台的文件调出来

--------------------------

vi开一个文件A后

:vs /path/另一个文件B---------------打开对比窗口

ctrl+w:切换两个窗口。

注:此操作是vim操作,root下vi不带vim,普通用户可以。

 

---------------------------------------------------------

/

:查找

回车后按n键查找下一个

--------

:set nu    :打开序号

:1000      :将光标移到第1000行

-----------------------

用vi查看文件编码

vi tb1.txt
:set fileencoding
        fileencoding=latin1

--------------------------------------------------

:%s#待替换的字符#替换后的字符#g

   %为通配,替换所有。

\ :反斜杠-用来转义特殊字符。

eg:0 1/2\3^4567890

1、去掉空格

:s# ##g ---------空格可以不用转义

2、将/替换成|

:s#\/#|#g

3、将\替换成|

:s#\\#|#g

 

:g/^\s*$/d                       ----------删除只有空白的行
 
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1   ----------将 data1 data2 修改为 data2 data1
 
:%s/\(\w\+\), \(\w\+\)/\2 \1/    ----------将 Doe, John 修改为 John Doe
 
:%s/\/\=line(".")           ----------将各行的 id 字符串替换为行号
 
:%s/\(^\<\w\+\>\)/\=(line(".")-10) .".". submatch(1)    
     将每行开头的单词替换为(行号-10).单词的格式,如第11行的word替换成1. word
 
:/OB/+1,$!sort                  ----------排序

 

-----------------------------------

 

more时用v进入vi

-------------------------------------------------------------------------------------------

转:

元字符 说明
. 匹配任意一个字符
[abc] 匹配方括号中的任意一个字符。可以使用-表示字符范围,
      如[a-z0-9]匹配小写字母和阿拉伯数字。
[^abc] 在方括号内开头使用^符号,表示匹配除方括号中字符之外的任意字符。
\d 匹配阿拉伯数字,等同于[0-9]。
\D 匹配阿拉伯数字之外的任意字符,等同于[^0-9]。
\x 匹配十六进制数字,等同于[0-9A-Fa-f]。
\X 匹配十六进制数字,等同于[^0-9A-Fa-f]。
\w 匹配单词字母,等同于[0-9A-Za-z_]。
\W 匹配单词字母之外的任意字符,等同于[^0-9A-Za-z_]。
\t 匹配字符。
\s 匹配空白字符,等同于[ \t]。
\S 匹配非空白字符,等同于[^ \t]。
\a 所有的字母字符. 等同于[a-zA-Z]
\l 小写字母 [a-z]
\L 非小写字母 [^a-z]
\u 大写字母 [A-Z]
\U 非大写字母 [^A-Z]
 
表示数量的元字符
元字符 说明
* 匹配0-任意个
\+ 匹配1-任意个
\? 匹配0-1个
\{n,m} 匹配n-m个
\{n} 匹配n个
\{n,} 匹配n-任意个
\{,m} 匹配0-m个
\_. 匹配包含换行在内的所有字符
\{-} 表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好
\= 匹配一个可有可无的项
\_s 匹配空格或断行
\_[]
 
元字符 说明
\* 匹配 * 字符。
\. 匹配 . 字符。
\/ 匹配 / 字符。
\\ 匹配 \ 字符。
\[ 匹配 [ 字符。
 
表示位置的符号
元字符 说明
$ 匹配行尾
^ 匹配行首
\< 匹配单词词首
\> 匹配单词词尾
 
替换变量
在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容。
 
懒惰模式
\{-n,m} 与\{n,m}一样,尽可能少次数地重复
\{-} 匹配它前面的项一次或0次, 尽可能地少
\| "或"操作符
\& 并列
 
 
函数式
:s/替换字符串/\=函数式
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容。
 
与Perl正则表达式的区别 ?
元字符的区别
Vim语法 Perl语法 含义
\+        +       1-任意个
\?        ?       0-1
\{n,m}    {n,m}   n-m
\(和\)    (和)     分组
 
例如:
1,去掉所有的行尾空格:
“:%s/\s\+$//”。“%”表示在整个文件范围内进行替换,“\s”表示空白字符(空格和制表符),“\+”对前面的字符匹配一次或多次(越多越好),“___FCKpd___0rdquo;匹配行尾(使用“\___FCKpd___0rdquo;表示单纯的“___FCKpd___0rdquo;字符);被替换的内容为空;由于一行最多只需替换一次,不需要特殊标志。这个还是比较简单的。(/)
 
2,去掉所有的空白行:
“:%s/\(\s*\n\)\+/\r/”。
这回多了“\(”、“\)”、“\n”、“\r”和 “*”。“*”代表对前面的字符(此处为“\s”)匹配零次或多次(越多越好;使用“\*”表示单纯的“*”字符),“\n”代表换行符,“\r”代表回车符,“\(”和“\)”对表达式进行分组,使其被视作一个不可分割的整体。因此,这个表达式的完整意义是,把连续的换行符(包含换行符前面可能有的连续空白字符)替换成为一个单个的换行符。唯一很特殊的地方是,在模式中使用的是“\n”,而被替换的内容中却不能使用“\n”,而只能使用“\r”。原因是历史造成的,详情如果有兴趣的话可以查看“:help NL-used-for-Nul”。
 
3,去掉所有的“//”注释:
“:%s!\ s*//.*!!”。首先可以注意到,这儿分隔符改用了“!”,原因是在模式或字符串部分使用了“/”字符,不换用其他分隔符的话就得在每次使用“/”字符本身时写成“\/”,上面的命令得写成“:%s/\s*\/\/.*//”,可读性较低。命令本身倒是相当简单,用过正则表达式的人估计都知道“.”匹配表示除换行符之外的任何字符吧。
 
4,去掉所有的“”注释:
“:%s!\s*/\*\_.\{-}\*/\s*! !g”。这个略有点复杂了,用到了几个不太常用的 Vim 正则表达式特性。“\_.”匹配包含换行在内的所有字符;“\{-}”表示前一个字符可出现零次或多次,但在整个正则表达式可以匹配成功的前提下,匹配的字符数越少越好;标志“g”表示一行里可以匹配和替换多次。替换的结果是个空格的目的是保证像“intmain()”这样的表达式在替换之后仍然是合法的。

你可能感兴趣的:(linux)