vi的基本概念
Command mode功能键列表
Linux shell vi 常操作[更精简]
Shell
vi的基本概念 http://www.cnblogs.com/harryguo/archive/2008/01/08/1030360.html
基本上vi可分为三种操作状态,分别是命令模式(Command mode)、插入模式(Insert mode)和底线命令模式(Last line mode),各模式的功能区分如下:
1. Comand mode:控制屏幕光标的移动,字符或光标的删除,移动复制某区段及进入Insert mode下,或者到Last line mode。
2. Insert mode:唯有在Insert mode下,才可做文字数据输入,按Esc等可回到Comand mode。
3. Last line mode:将储存文件或离开编辑器,也可设置编辑环境,如寻找字符串、列出行号等
不过可以把vi简化成两个模式,即是将Last line mode也算入Command mode,把vi分成Command 和Insert mode。
Comand mode模式下: insert,i,a,o
寻找字符串:/ + n(next)
到文件末尾:shift + g
删除一个字符:x Esc
删除一行:d :
vi的基本操作
•进入vi
在系统提示符号输入vi及文件名称后,即可进入vi全屏幕编辑画面:
$ vi testfile
有一点要特别注意,就是您进入vi之后是处于“Command mode”下,您要切换到Insert mode才能输入文字。初次用vi的用户都会想先用上下左右键移动光标,结果电脑一直叫,把自己气个半死,
所以进入vi后,先不要乱动,转换入Insert后再说。
•切换至Insert mode编辑文件
在Command mode下按‘i’、‘a’或‘o’三键就可进入Insert mode。这时候您就可以开始输入文字了。
i: 插入,从目前光标所在之处插入所输入的文字。
a: 增加,目前光标所在的下一个字开始输入文字。
o: 插入新的一行,从行首开始输入文字。
•Insert的切换→Command mode,按Esc键
您目前处于Insert mode,您就只能一直打字。假如您发现打错字了,想用光标键往回移动,将该字删除,就要按ESC键转换回Command mode,再删除文字。
•离开vi及存文件
在Command mode下,可按冒号“:”键入入Last line mode,例如:
:w filename (输入“w filename”,将文章存入指定的文件名filename)
:wq (输入“wq”,因为进入之时已经指定文件名testfile,所以会写入testfile并离开vi)
:q! (输入“q!”,强制离开并放弃编辑的文件)
Command mode功能键列表
在介绍command mode指令的时后,指令后面加上“常用”字眼的功能键,表示比较常用的vi指令,请读者您一定要学会、记住。
(1)I、a、o切换进入Insert mode。[超级常用]
(2)移动光标
vi可以直接用键盘上的光标键来上下左右移动,但正规的vi是用小写英文字母
h、j、k、l,分别控制光标左、下、上、右移一格。
按Ctrl+B:屏幕往后移动一页。[常用]
按Ctrl+F:屏幕往前移动一页。[常用]
按Ctrl+U:屏幕往后移动半页。
按Ctrl+D:屏幕往前移动半页。
按 0 (数字零):移动文章的开头。[常用]
按 G:移动到文章的最后一行开头。[常用]
按 w:光标跳到下个word的开头。[常用]
按 e:光标跳到下个word的字尾。
按 b:光标回到上个word的开头。
按 $:移到光标所在行的行尾。[常用]
按 ^:移到该行第一个非空白的字符。
按 0:移到该行的开头位置。[常用]
按 #:移到该行的第#个位置,例:51、121。[常用] 有待测试?
(3)删除文字
x:每按一次删除光标所在位置的后面一个字符。[超常用] Soraris 是所在位置字符。
#x:例如,6x 表删除光标所在位置的后面6个字符。[常用]
X:大字的X,每按一次删除光标所在位置的前面一个字符。
#X:例如,20X 表删除光标所在位置的前面20个字符。
dd:删除光标所在行。[超常用] => D
#dd:例如,6dd表删除从光标所在的该行往下数6行之文字。[常用]
(4)复制
yw:将光标所在处到字尾的字符复制到缓冲区中。
(想在和#x、#X的功能相反)
p:将缓冲区内的字符粘贴到光标所在位置(指令‘yw’与‘p必须搭配使用)。
yy:复制光标所在行。[超常用]
p:复制单行到您想粘贴之处。(指令‘yy’与‘p’必须搭配使用)
#yy:如:6yy表示拷贝从光标所在的该行往下数6行之文字。[常用]
p:复制多行到您想粘贴之处。(指令‘#yy’与‘p’必须搭配使用)
“ayy:将复制行放入buffer a, vi提供buffer功能,可将常用的数据存在buffer
“ap:将放在buffer a的数据粘贴。
“b3yy:将三行数据存入buffer b。
“b3p:将存在buffer b的资料粘贴
(5)取代
r: 取代光标所在处的字符:[常用]
R:取代字符直到按Esc为止。
(6)复原(undo)上一个指令
u:假如您误操作一个指令,可以马上按u,回复到上一个操作。[超常用]
可以重复执行上一次的指令。
(7)更改
cw:更改光标所在处的字到字尾$处。
c#w:例如,c3w代表更改3个字。
(8)跳至指定行
Ctrl+G:列出光标所在行的行号。
#G:例如,15G,表示移动光标至文章的第15行行首。[常用]
Last line mode下指令简介
读者您要使用Last line mode之前,请记得先按Esc键确定您已经处于Command mode下后,再按冒号“:”或“/”或“?”三键的其中一键进入Last line mode。
1.列出行号 :set nu
提示符号“:”前 输入“set nu”后,会在文章的每一行前面列出行号。
2.跳到文章的某一行 :15[Enter]
#:井号代表一个数字,在Last line mode提示符号“:”前输入数字,再按Enter就会跳到该行了,如:15[Enter]就会跳到文章的第15行。[常用]
3.寻找字符串 ? + n 往下寻找 :? + n 往前寻找
/关键字:先按/,再输入您想寻找的字,如果第一次找的关键字不是您相尽可能的,可以一直按n会往下寻找到您要的关键字为止。
?关键字:先按?,再输入您想寻找的字,如果第一次找的关键字不是您想要的,可以按n会往前寻找到您要的关键字为止。
4.取代字符串
1,
s
/
s
t
r
i
n
g
/
r
e
p
l
a
e
/
g
:
在
l
a
s
t
l
i
n
e
m
o
d
e
输
入
“
1
,
s/string/replae/g:在last line mode输入“1,
s/string/replae/g:在lastlinemode输入“1,s/string/replace/g”会将全文的string字符串取代为replace字符串,其中1,
s
就
是
指
搜
寻
区
间
为
文
章
从
头
至
尾
的
意
思
,
g
则
是
表
示
全
部
取
代
不
必
确
认
。
s就是指搜寻区间为文章从头至尾的意思,g则是表示全部取代不必确认。 %s/string/replace/c:同样会将全文的string字符串取代为replace字符串,和上面指令不同的地方是,%s和1,
s就是指搜寻区间为文章从头至尾的意思,g则是表示全部取代不必确认。s是相同的功能,c则是表示要替代之前必须再次确认是否取代。
1,20s/string/replace/g:将1至20行间的string替代为relpace字符串。
5.存文件
w:在last line mode提示符号“:”前按w即可将文件存起来。[超常用]
#,# w filename:如果您想摘取文章的某一段,存成另一个文件,可用这个指令#代表行号,例如30,50 w nice,将您正在编辑文章的第30~50行存成nice这个文件。
6.离开
q:按q就离开,有时如果无法离开vi,可搭配“!:强置离开vi,如“q!”
qw:一般建议离开时,搭配w一起使用,如此离开时还可存文件。[常用]
linux shell vi常操作
1.查找
/xxx(?xxx) 向下/向上查找字符串,n查找下一个,N查找上一个,如要忽略大小写::set ignorecase
gd 查找光标所在单词相同的单词,并将光标移至匹配的第一个单词处
*(#) 查找光标所在单词的下(上)一个单词, n(下一个),N(上一个)
2.快速移动光标
w(e) 移动光标到下一个单词
b 移动光标到上一个单词
0移动光标到本行最开头
^移动光标到本行字符的最开头处 同上
$移动光标到本行结尾处
H移动光标到屏幕的行首
M移动光标到屏幕的中间
L移动光标到屏幕的尾行
gg移动光标到文档行首
G移动光标题以文档行尾
` 返回上次修改的点
’ 返回上次修改的行
" 返回上次光标所在位置
3.拷贝、删除、粘贴
在vi中y是复制,d是删除,p是粘贴,其中复制与删除是与光标移动命令结合使用的。
yw 复制光标所在的单词
dw 删除光标所在的单词
y0 复制光标所在到行首的内容
d0 删除光标所在到行首的内容
y$ 复制光标所在到行尾的内容 =yw
d$ 删除光标所在到行尾的内容 =dw
dd 删除光标所在的行
yy 复制光标所在的行
D 删除从当前光标到光标所在行尾的内容
4.数字与命令
vi中数字与命令结合,一般表示重复此命令
5w(e) 光标向后移动5个单词
5yy 复制5行
5dd 删除5行
:12,24y 复制12-24行内容
:12,y 复制12行到光标所在行
:,24y 复制光标所在行到24行,(删除类似
更多连接:http://hi.baidu.com/netgreenspider/blog/item/ee9fe5f16a382803b17ec57e.html 【shell】常用命令linux下vi编辑器命令大全
Shell
http://www.google.com.hk/search?hl=zh-CN&newwindow=1&safe=strict&biw=985&bih=823&q=linux+shell+vi&aq=f&aqi=g1&aql=&oq=
Linux Shell 脚本编程专题 http://www.netemu.cn/bbs/thread-13903-1-1.html
Bash 实例,第 2 部分 http://www.ibm.com/developerworks/cn/linux/shell/bash/bash-2/index.html 注:很实用
接收自变量
$0 调用脚本名称,
1
…
n
传
递
给
脚
本
的
变
量
或
参
数
,
1…n 传递给脚本的变量或参数,
1…n传递给脚本的变量或参数,#传递给脚本的变量数总数。
Bash编程结构
方便的条件语句 -* 运算符
$myvar 引用定义的变量 运算符总数
文件比较运算符:-e,-d,-f,-L,-r,-w,-x, -nt,-ot 后跟文件名 9
字符串比较运算符:-z,-n,=,!= 后跟字符串 4
算术比较运算符:-eq,-ne, -lt,-gt,le,ge 6
字符串比较说明, 请一定使用双引号" " , not 引号 ' '
myvar = foo bar oni
因为如果变量中恰巧有一个空格或制表键,bash 将无法分辨,从而无法正常工作。
因为变量没放在双引号中,所以 bash 认为方括号中的自变量过多。可以用双引号将字符串自变量括起来消除该问题。请记住,如果养成将所有字符串自变量用双引号括起的习惯,将除去很多类似的编程错误。"foo bar oni" 比较 应该写成:
[ "foo bar oni" = "foo bar oni" ]
循环结构:"for"
注意"[" 后, "]"前,必须要有空格。
如果只引用当前工作目录中的文件(例如,如果输入 "for x in *"),则产生的文件列表将没有路径信息的前缀。
扩展:
run bash
./b.sh
. b.sh "basename" 去除文件前面的路径信息,"dirname“文件的路径,如果是当前文件,则执行后结果为“.”
. /tmp/jeanne/b.sh
$ vi b.sh a.txt
$ . b.sh /tmp/jeanne/a.txt
有时需要一次引用 所有 命令行自变量。针对这种用途,bash 实现了变量 "$@",
它扩展成所有用空格分开的命令行参数,在"for" 循环部分中使用该变量。
$ ./a.sh hello there you silly
Shell 算术
使用 shell 结构来执行简单的整数运算。只需将特定的算术表达式用 "$((" 和 "))" 括起,bash 就可以计算表达式。这里有一些例子:
$ echo $(( 100 / 3 ))
$ echo $((100/3))
$ myvar="56"
$ echo $(( $myvar + 12 ))
68
$ echo $(( $myvar - $myvar ))
$ myvar=$(( $myvar + 1 ))
$ echo $myvar
57
更多的循环结构:"while" 和 "until"
myvar=0 myvar=0
while [ "$myvar" -ne 10 ] until [ $myvar -eq 10 ]
do do
echo $myvar echo $myvar
myvar=$(( $myvar + 1 )) myvar=$(( $myvar + 1 ))
done done
"Until" 语句提供了与 "while" 语句相反的功能:只要特定条件为 假 ,它们就重复。
Case 语句
case "${1}" in 匹配,则执行紧接 ")" 之后的行,直到 ";;" 为止,然后 bash 继续执行结束符 "esac" 之后的行
a)
echo "a"
;;
b)
echo "b"
exit
;;
*)
echo "other"
exit
;;
esac
函数与名称空间
名称空间
在 bash 中,每当在函数内部创建环境变量,就将其添加到 全局名称空间。这意味着,该变量将重写函数之外的全局变量,并在函数退出之后继续存在:
myvar="hello" 输出: myvar="hello" 输出:
myfunc() { one myfunc() { one
myvar="one two three" two local x two
for x in $myvar three local myvar="one two three" three
do one two three three for x in $myvar hello three ?????x's value
echo $x 局部变量x在函数退出之后继续有效。 do
done echo $x 解决此问题的最好方法是通过使用 "local" 命令,在一开始就预防影响全局变量的可能性。
} done 当使用 "local" 在函数内部创建变量时,将把它们放在局部名称空间中,并且不会影响任何全局变量。
myfunc } 这里演示了如何实现上述代码,以便不重写全局变量:
echo $myvar $x myfunc 此函数不影响任何全局变量,鼓励您用这种方式设计所有的函数。只有在明确希望要修改全局变量时,才 不应该使用 "local"。
echo $myvar $x