vi
文本编辑大概是系统运行中最为频繁的操作了,而在Unix/Linux下有一种标准而功能极为强大的编辑器,那就是Vi(Visual Edtior)。
对于Unix/Linux的初学者来说,vi可能显得极为不友好――所有操作都要用特殊的击键或者组合键来控制,而且似乎这些命令跟要执行的操作并没有什么关系,非常难记,比起Windows下的notepad实在是”恐怖”多了。其实这只是转移工作环境中的正常现象,如果经过大量的实践,你会发现其实vi对于键盘的利用非常合理,如果用的熟练了,vi不仅可以成为你的文本编辑利器,而且对于系统配置甚至编程都有莫大的帮助。
vi实用操作指南
作为一个Unix系统下标准的全屏幕文本编辑器,vi可以方便的实现插入、修改、拷贝粘贴三种基本的编辑操作。但是不像其他的字处理器,vi是以指令模式作为缺省的模式运行的。
更复杂的操作可以用一系列的按键来完成。
【进入vi 与退出】
Vi 有三种模式,输入模式(Inserting Mode)、指令模式(Command Mode)以及ex模式(Ex Mode)。在输入模式下可以输入文字,而指令模式下可以执行编辑文件、存档等等指令;Ex模式用于执行另外一些功能,如查找、替换文本、多文件的操作等等。 要进入vi可以直接在Shell提示符下键入vi [文件名称],如果该文件在当前目录不存在,则vi创建之。
为了进入输入模式,有好几种方法:
新增 (append)
a: 从光标所在位置后面开始添加内容,光标后的内容随新增字符向后移动。
A: 从光标所在列最后面的地方开始添加内容。
插入 (insert)
i: 从光标所在位置前面开始插入内容,光标后的内容随新增内容向后移动。
I: 从光标所在列的第一个非空白字符前面开始插入内容。
开始 (open)
o: 在光标所在列下新增一列并进入输入模式。
O: 在光标所在列上方新增一列并进入输入模式。
可以随时用ESC键切换到指令模式,连续按一两次就够了,这时系统会发出哔哔声以确定进入指令模式。然后再指令模式下有多种退出方法:
ZZ 保存并退出
保存并退出
:wq 保存并退出
:w 保存并返回指令模式
:30,60w [新文件] 将30到60行的内容写入[新文件]
:30,60w>> [文件] 将第30到60行的内容写入[文件]的末尾
:q 退出
:q! 退出并丢掉所有未保存信息
Q 退出vi,激活ex
:e file2 在不离开vi的条件下编辑file2
:n 编辑下一个文件
:e! 回到当前编辑文件上次保存的状态
vi 基本编辑
【移动光标】
移动光标自然是编辑过程中的基本技能,这个步骤一定要熟练掌握。
常用的移动命令键有:
h 左移一个字符
j 下移一行
k 上移一行
l 右移一个字符
w,W 跳至后一个字(W忽略标点)
b,B 跳至前一个字(B忽略标点)
$ 至行尾
^ 至本行第一个非空字符
0 至行首
G 至缓冲区的起始处
nG n是整数,至第n行
CTRL-d 向下半页
CTRL-u 向上半页
CTRL-f 向下一页
CTRL-b 向上一页
H 移动到当前窗口的第一列
M 移动到当前窗口的中间列
L 移动到视窗的最后列 │
e 移动到下个字的最后一个字母
n- 减号移动到上一列的第一个非空白字符,前面加上数字可以指定移动到以 上 n 列
n+ 加号移动到下一列的第一个非空白字符,前面加上数字可以指定移动到以下 n 列
fx 往右移动到 x 字符上
Fx 往左移动到 x 字符上
tx 往右移动到 x 字符前
Tx 往左移动到 x 字符前
; 配合 f 和 t 使用,重复一次
, 配合 f 和 t 使用,反方向重复一次
【编辑】
x 删除光标所在字符,同时所在行的位于光标后的文字一起左移一格;如果删除的是某行的最后一个字符,则删除后光标左移一格
d 是删除命令,它作用于文本对象,即可被移动命令跨过的文本块。例如w可以用来跳至下一个字开始处,那么dw从光标位置所在字删至下一字开始处;6w将删至光标所在字后第六个字开始处等等
dd 删除光标所在的行
r 修改光标所在字符,r 后接着要修改的字符
R 进入取代状态,新增内容会覆盖原先内容,直到按 [ESC] 回到指令模式下止
s 删除光标所在字符,并进入输入模式
S 删除光标所在的列,并进入输入模式
u 撤消最近一次对文本的改动。标准版的vi只能执行一级撤消,而vim则可以多级
U 行撤消命令,用来撤消从光标最近一次移到该行时起对光标所在行做的全部改动
n( 左括号移动到句子的最前面,前面加上数字可以指定往前移动 n 个句子.句子以! . ? 三种符号来界定
n) 右括号移动到下个句子的最前面,前面加上数字可以指定往后移动 n 个句子
n{ 左括弧移动到段落的最前面,前面加上数字可以指定往前移动 n 个段落。段落以段落间的空白列界定
n} 右括弧移动到下个段落的最前面,前面加上数字可以指定往后移动 n 个段落
看到这里,恐怕有的读者已经开始吐舌头了:这么多”莫名其妙”的指令来编辑文本实在是太复杂了!还是那句话,”熟能生巧”。如果用的熟练了,利用这些命令来移动、编辑简直都不是大脑在控制,你的手指已经足够熟练为你做好任何你想做的事情
【指令组成】
现在可以提一下vi的指令组成。上面也看到了,很多指令都是控制键和数字等结合起来控制的。没错!其中很多大致是由指令与范围所构成。例如 dw 是由删除指 d 与范围 w 所组
成,代表删除一个字 d(elete) w(ord) 。
指令列表有:
d 删除(delete)
y 复制(yank)
p 放置(put)
c 修改(change)
范围可以是下列几个:
e 光标所在位置到该字的最后一个字母
w 光标所在位置到下个字的第一个字母
b 光标所在位置到上个字的第一个字母
$ 光标所在位置到该列的最后一个字母
0 光标所在位置到该列的第一个字母
) 光标所在位置到下个句子的第一个字母
( 光标所在位置到该句子的第一个字母
) 光标所在位置到该段落的最后一个字母
{ 光标所在位置到该段落的第一个字母
其实组合命令远远不止这些,更多的需要在实践中慢慢体会。
【查找样本】
在文本内移动的时候经常需要查找一定模式(Pattern)构成的文本,vi也提供了相应的命令键
/pattern 移至下一个包含pattern的行
?pattern 移至上一个包含pattern的行
/ 往下重复查找
? 往上重复查找
n 在同一方向重复查找
N 在相反方向重复查找
/pattern/+n 移至下一个pattern所在行后的第n行
?pattern?-n 移至上一个Pattern所在行前的第n行
/pattern/z- 重绘屏幕,使下一个包含pattern的行位于屏幕的最底行
% 移至与光标所在的括弧匹配成对的圆括弧或大括弧
【标记文本】
也可以将某段文本标记起来,方便以后跳转
mchar 用字母char标记当前光标的位置
`char 移至char所标记处
‘char 移至char标记所在行的开头处
” 移至当前行上一次所在位置(在光标移动之后)――一个双引号
” 移至当前行上第一次所在位置的行的开头处(在光标移动之后)――两个单引号
【缓冲区】
vi的缓冲区功能也是它的一大特色。它分为几个大类
1. 有名缓冲区
如果要把几个不同的文本同时保存在不同的缓冲区内以便放置,需要使用有名缓冲区。
有名缓冲区可以开辟出多达26个独立的存储区,用于存放删除或者取样操作的文本。它以双引号”后接小写字母命名,从”a到”z。在命令前添加缓冲区的名字可以将取样或者删除操作
的文本送入某缓冲区。下面是有关有名缓冲区的一些命令:
“azdw 删除后两个字,将他们放入缓冲区a
“jD 删除从光标至行尾的内容,并放入缓冲区j
“jp 在光标后放置缓冲区j的内容
“by) 从光标处至句尾的内容取样放到缓冲区b
“a2yy 取样两行到缓冲区a,删除缓冲区a中原有的内容
“Ad4w 删除光标后4个字,附加到缓冲区a
“Ay) 取样从光标到行尾的内容,并附加到缓冲区a
2. 删除缓冲区
另外,vi还有有编号的删除缓冲区。撤消命令只能恢复上一次的删除,当且仅当这个删除是最后一次操作。但是,vi可以把最近9次删除的内容都放入9个编号从1到9的缓冲区内。最
近一次删除保存在缓冲区1,次近的在缓冲区2,依此类推。例如,”2p可以放置第二个删除缓冲区中的内容。
【跟Unix Shell的结合】
作为Unix各种系统的标准配置,vi还提供了跟Shell的良好的接口。下面是一些常用命令:
:sh 运行shell直到用Ctrl-D命令退出为止
:! Cmd 执行Shell命令Cmd,然后回到vi。另外,这里的cmd可以使用某些特殊的扩展字符(vi中的定义),如#可扩展为备份文件名;%可扩展为当前文件名;!可扩展为前一个
shell命令
:!! 重复前一个shell命令
bject cmd 执行shell命令,用cmd的输入替换文本对象object。如果cmd接受标准输入,则必须用特定的文本对象
n !! cmd 执行shell命令cmd。用cmd的输入内容替换从当前行开始的n行文本。n的缺省值是1。如果cmd接收标准输入,则必须用特定的行
【EX功能汇总】
vi是类Unix操作系统中使用极为广泛的文本编辑器之一。无论是Unix、Solaris或Linux都默认提供这个工具。可以说只要熟悉了vi,在任何一种类Unix的操作系统平台上都可以自如地进行文本编辑。关于vi的基本用法的资料有很多,本文的目的不是重复这些基本的用法,而是想给初步掌握vi基本用法的人提供一些实用技巧,使之能更快捷、高效地利用vi编辑文件。
vi有命令模式和插入模式之分。vi启动后就处于命令模式。在命令模式下,可以随意移动光标、进行复制和粘贴文本等操作。利用“a”、“i”、“c”、“C”、“O”和“o”等命
令可以从命令模式切换到插入模式。在插入模式下,可以输入文本,按Esc键切换回命令模式。为了区别不同模式下的命令,本文在介绍时会注明是何种模式下的操作。
另外,本文的所有操作都是在Red Hat 9.0所带的vim中进行。本文介绍的各种技巧多数在各种vi版本中也都是可行的。
替换操作(经常用到的一些简单替换命令有:
◆ s 将当前字符替换为一个或多个字符,例如5 s 表示将从当前字符开始的5个字符替换为一个或多个字符;
◆ S 将当前行替换为一个或多个字符;
◆ r 单个字符替换。
文本格式转换
将DOS格式文本转成Unix格式文本,命令如下:
:1,$s/^M//g
其中^M是同时Ctrl+V+M按出来的,表示回车。
在行首尾添加字符串
用下列命令在文本每行的行首添加字符串“NewString”,请注意空格的存在。
:g/^/s//NewString/g
:%s/^/NewString/g
用下列命令在每行的行尾添加字符串“NewString”:
:g/$/s//NewString/g
:%s/$/NewString/g
从文本的第3行至最后一行的行首全部插入字符串“NewString”:
:3,$s/^/NewString/
在整个文件中替换
在整个文件中替换特定字符串,所用的命令如下:
:%s/old_string/new_string/g
如果仅将文件中的第3行到第7行中的“old_string”替换成“new_string”,那么使用下列命令:
:3,7s/old_string/new_string/
注意,其中“s”为表示替换动作,“%”表示所有行,“g”表示全文,“^”表示行首,“$”表示行尾。
Vim正则表达式
Vim中的正则表达式功能很强大,如果能自由运用,则可以完成很多难以想象的操作。
使用正则表达式的命令
使用正则表达式的命令最常见的就是 / (搜索)命令。其格式如下:
/正则表达式
另一个很有用的命令就是 :s(替换)命令,将第一个//之间的正则表达式替换成第二个//之间的字符串。
:s/正则表达式/替换字符串/选项
在学习正则表达式时可以利用 / 命令来练习。
元字符
元字符是具有特殊意义的字符。使用元字符可以表达任意字符、行首、行尾、某几个字符等意义。
元字符一览
|
元字符 |
说明 |
|
. |
匹配任意一个字符 |
|
[abc] |
匹配方括号中的任意一个字符。可以使用-表示字符范围, |
|
[^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]。 |
另外,如果要查找字符 *、.、/等,则需要在前面用 \ 符号,表示这不是元字符,而只是普通字符而已。
|
元字符 |
说明 |
|
\* |
匹配 * 字符。 |
|
\. |
匹配 . 字符。 |
|
\/ |
匹配 / 字符。 |
|
\\ |
匹配 \ 字符。 |
|
\[ |
匹配 [ 字符。 |
表示数量的元字符
|
元字符 |
说明 |
|
* |
匹配0-任意个 |
|
\+ |
匹配1-任意个 |
|
\? |
匹配0-1个 |
|
\{n,m} |
匹配n-m个 |
|
\{n} |
匹配n个 |
|
\{n,} |
匹配n-任意个 |
|
\{,m} |
匹配0-m个 |
表示位置的符号
|
元字符 |
说明 |
|
$ |
匹配行尾 |
|
^ |
匹配行首 |
|
\< |
匹配单词词首 |
|
\> |
匹配单词词尾 |
使用例
/char\s\+[A-Za-z_]\w*; " 查找所有以char开头,之后是一个以上的空白,
" 最后是一个标识符和分号
/\d\d:\d\d:\d\d " 查找如 17:37:01 格式的时间字符串
:g/^\s*$/d " 删除只有空白的行
:s/\
替换变量
在正规表达式中使用 \( 和 \) 符号括起正规表达式,即可在后面使用\1、\2等变量来访问 \( 和 \) 中的内容。
使用例
/\(a\+\)[^a]\+\1 " 查找开头和结尾处a的个数相同的字符串,
" 如 aabbbaa,aaacccaaa,但是不匹配 abbbaa
:s/\(http:\/\/[-a-z\._~\+%\/]\+\)/\1<\/a>/ " 将URL替换为http://url的格式
:s/\(\w\+\)\s\+\(\w\+\)/\2\t\1 " 将 data1 data2 修改为 data2 data1
函数式
在替换命令 s/// 中可以使用函数表达式来书写替换内容,格式为
:s/替换字符串/\=函数式
在函数式中可以使用 submatch(1)、submatch(2) 等来引用 \1、\2 等的内容,而submatch(0)可以引用匹配的整个内容。
使用例
:%s/\
:%s/^\<\w\+\>/\=(line(".")-10) .".". submatch(1) " 将每行开头的单词替换为 (行号-10).单词 的格式,
" 如第11行的 word 替换成 1. word
与Perl正则表达式的区别
元字符的区别
|
Vim语法 |
Perl语法 |
含义 |
|
\+ |
+ |
1-任意个 |
|
\? |
? |
0-1个 |
|
\{n,m} |
{n,m} |
n-m个 |
|
\(和\) |
(和) |
分组 |
===vi regex==================================================
刪除空格,以取代的方式:
:%s/\空格//g
刪除Tab,以取代的方式:
:%s/\Tab//g
在每行結尾加上/32:
:%s/$/\/32/g = sed 's/$/\/32/' filename = sed 's/$/\/32/g' filename
在每行行首加上 "."
:%s/^/\./g = sed 's/^/\./' filename = sed 's/^/\./g' filename
刪除文件中以#號開頭的注釋行:
:%g/^$/d
刪除空白行:
:%g/^$/d
取出不帶特定關鍵字符串的行:
grep -v '特定關鍵字符串' text1 > text2
選出以特定字符串開頭的行:
cat text | grep ^'特定字符串'
dd 刪除游標所在行
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/26193454/viewspace-705491/ ,如需转载,请注明出处,否则将追究法律责任。