ex命令

ex 是一个行编辑器。如同对文件调用vi编辑器一样,也可以对文件调用ex行编辑器。

$ which ex
/bin/ex 

在RHELV4U2 中的路径

$ex practice
"practice" 6 lines, 320 characters
:

显示该文件的行数,多少个字符。停止在:冒号命令提示符。

:1p
With a screen editor you can 
:

p 打印到屏幕 1p 打印第1行到屏幕。实际上可以去掉p,因为行号本身就等价于打印该行的命令。

:1,3
With a screen editor you can
scroll the page, move the cursor,
delete lines, insert characters, and more,

用逗号隔开,中间空格可有可无。打印1到3行。

如果没有行号就认为作用于当前行。
:1
With a screen editor you can
:/screen/line/
With a line editor you can

命令修改后行将会重新显示。

:1s/screen/line/  
With a line editor you can

作用是相同的。只是在一个命令中完成。
在vi的冒号提示符下输入:6。也可以跳到第6行。这跟vi在编辑模式中使用6G作用是相同的。在ex 中的冒号命令提示符后输入vi,可以调用vi编辑器。在vi中输入Q可以调用ex。

                       使用ex进行编辑

许多ex命令完成的编辑操作在vi中都有更简单的等价命令可以完成。我们可以用dw和dd来删除一个单词和一行。但在ex命令中可以使用单个命令对 大的文本块 进行修改,因此在想对
许多行进行修改时,ex命令会更有用。 

记住在vi中每个ex命令前必须有:冒号。

          delete          d         删除行
          move            m         移动行
          copy            co        复制行
                          t         复制行

行地址

对于ex编辑器命令,必须给出ex所要编辑的行。对于ex的move和copy必须给出ex移动或
复制文本的目标位置。
 
          1   使用明确的行号
          2   使用能帮助你指定相对于文件中当前位置的行号的符号
          3   使用搜索模式作为标识所要编辑的行的地址

定义行的范围

你可以使用行号明确地定义一行或行的范围。使用明确数字的地址称为绝对行地址。
example
:3,18d       删除3到18行
:160,224m23  将160到224行间的内容移动到23行的后面
:23,29co100  将23到29行间的内容复制到100行的后面

可以使用:set number 简写为:set nu 显示行号。显示行号在写文件的时候并不能保存,如果打印文件,也不能打印它们。行号会一直显示直到退出vi会话或取消set选项
:set nonumber 或简写为 :set nonu 。
注:本次设置了:set number 在下次打开vi编辑器时设置将会丢失。需要修改vi的配置文件才可以在默认情况下显示行号。

:1,10#  #可以暂时地显示部分行的行号。但只是显示,无法在显示上作业。

CTRL+G 可以显示当前行的行号。在:set ruler 时显示的信息比:set noruler的要少很多。CTRL+G是一个vi快捷键。

:=  显示总行数
:.= 显示当前行的行号
:/pattern/= 显示一个与模式相匹配的行的行号

行地址符

表示行地址的符号叫行地址符。点(.)表示当前行,$表示文件的最后一行。%表示文件中的每一行,它等同与1,$的组合。这些符号也可以与绝对行地址组合使用。

example
:.,$d      删除当前行到最后一行的文本
:20,.m$    将20行到当前行的文本移动到最后一行后面
:%d        删除说有的行
:%t$       将所有的文本复制一份拷贝到文本的末尾

除了绝对地址以外,也可以指定一个相对当前行的地址。用符号+和-就像数字运算符一样,当将其方置在数字前面时,这些符号就会加上或减去跟在它们后面的数值。

example
:.,.+20d   删除当前行开始下面的20行
:226,$m.-2 将226行到文件末尾的文本移动到当前行的上2行的下面
:.,+20#   显示当前行和下面20行的行号

实际上,由于当前行是假定的开始位置,因此你在使用+或-时不需要输入圆点(.)。
如果在+和-的后面没有跟数字,它们就分别相当于+1和-1.
注意不能把加号跟减号与其后面的数字分开。否则会发生歧意。
++ 代表 当前行+1+1 就是当前行+2
--代表 当前行-1-1 就是当前行-2

数字0代表文件开头(虚构的0行).0等同与1-。这些命令允许移动或复制行到文件的真正开始位置,即现有文本第一行的前面

example
:-,+t0   将当前行的上一行和下一行加上当前行复制到文本的开头部分

搜索模式

example
:/pattern/d  删除一个包含pattern的行

:/pattern/+d  删除一个包含pattern的行的下面的行

:/pattern1/,/pattern2/d  删除从第 一个包含pattern1的行到第一个包含pattern2的行之间的文本。

:.,/pattern/m23 移动当前行到第一个匹配pattern的行之间的行到23行的后面

注意 模式的前面和后面要用斜杆来定界

vi中用模式匹配进行删除操作与在ex中使用模式匹配删除操作的不同点

example

d/while 删除从当前光标到光标后第一个匹配while字符之间的所有字符。但是除这些字符以外在同一行上的字符会被保留

:.,/while/d  ex会删除指定行的全部。只要是在匹配间的行都会被删除。同一行上的所有字符也会被删除

重新定义当前行的位置

example
:100,+5 p
First address exceeds second  第一地址在第二地址以后

出现这种情况的原因是+5是当前光标所在位置+5的行的行号。这个值在比100要小。比如当前光标在第1行。那+5就是第6行。100,6就是错误的。
我们需要的是使命令把第100行当作是"当前行"的方法,即使光标位于第一行时也时如此。
:100;+5 p
当你使用;好时,就会将第一个行地址当成当前行而重新计算。
:/pattern/;+10 p
打印第一个匹配/pattern/的行跟它下面10行的内容

你可以使用空格来分隔ex命令中的不同元素,这样可以更容易阅读命令。但是不能在模式里把空格作为分隔符或在替换命令的结尾使用空格。

                        全局搜索

在vi中使用/ 来搜索文件中的字符模板,ex也有全局命令g,可以让你搜索模板并显示找出的所有包含该模式的行。命令:g!的作用与:g相反,使用:g! 的作用与:g相反,使用:g!可以搜索不包含模板的行。

可以对文件中的所有行使用全局命令,也可以使用行地址把全局搜索限制在指定的行或行范围。

:g/pattern      寻找移动到模板最后出现的位置
:g/pattern/p    寻找并显示文件中所有符合模板的行
:g!/pattern/nu  寻找并显示所有不包含模板的行,同时显示这些行的行号
:60,124g/pattern/p  寻找并显示60行到124行之间所有符合模板的行

                        组合ex命令

在ex中可以使用竖直条(|)。它允许用户把多个命令组合在同一个ex提示符下。在使用|时,要注意所指定的行地址。如果一个命令影响到文件中的顺序,那么下一个命令将使用新的行位置进行工作。
注 :| shell中的管线命令,在这里起到的作用跟shell中的;作用很象

:1,3d | s/thier/their/
把第一行到第三行删除。然后在当前行进行替换

:1 , 5 m 10 | g/pattern/nu
把第一行和第五行之间的内容移动到第10行的后面,然后显示所有包含模板的行并列出行号

注:在命令中使用空格会使命令更容易阅读。但要注意加的位置不能产生歧异

                        保存和退出文件

ZZ 在vi中退出并保存文件 zz 将当前行移动到屏幕中央
可以使用ex中的命令更好的控制保存与退出。

:w 把缓冲区的内容写到磁盘中但不退出。可以在编辑期间使用:w保护编辑操作以避免系统瘫痪或重大的编辑错误。

:q 退出编辑器 如果对文件做了修改,在退出时会被阻拦并跳出提示。只有在没有做任何修改的情况下才能顺利的用:q退出

:wq 保存并退出,即使文件没有修改,写操作也会无条件的执行

:x  写文件并退出,只有修改了文件写操作也能进行

:wq 和 :x 虽然都是写文件并退出。但是:wq是我条件的,而:x是在修改过的前提下

No write since last change. 没有写入最后一个改变

:w! 强行保存 可以在只读方式下写入,但必须具有写入的权限
:q! 强行退出 不做任何修改 缓冲区内容被删除

:w practice.new
我们可以将当前缓冲区中的内容保存到一个新的文件中

:230,$w newfile
也可以选择缓冲区中的部分文本保存到一个新的文件中

:340,$w >>newfile
可以将缓冲区的部分内容追加到一个文件的尾部。很想shell中的输出重定向符

                     把文件复制到另一个文件中

:read filename       缩写为  :r filename
在当前文件中读入一个新的文件,默认插入在当前光标的下一行

:185r filename  
在当前文本的185行插入一个新的文件

:$r filename
在文件尾部插入一个新的文件

:0r filename
在文件的首部插入一个新的文件

:/pattern/r filename
在匹配模板的下一行插入新的文件


                      编辑多个文件

编辑多个文件不用频繁的关闭和开启vi。并且可以保留已指定的缩写和命令序列,以及复制缓冲区,这样可以在文件间复制文本。

vi file1 file2

首先屏幕上显示的是file1中的内容。对file1编辑结束后,:w 保存file1,:n 命令调用下一个文件file2

:args 缩写:ar 列出在命令行上指定的文件,当前文件使用方括号括起来
:rewind 缩写 :rew 命令把当前文件重新设置为命令行上指定的第一个文件

                       调用新的文件

不用在开始就用vi调用多个文件。可以在ex中用:e 命令在任何时候切换到另一个文件

:e filename 

调用了新的文件后vi把两个文件名记为当前文件名和备份文件名,也可以通过使用符号%和
#来表示。

:e # 返回上一个编辑的文件          
:r # 读取上一个编辑的文件
:e! # 放弃对当前文本的修改,返回到上一个文件
:n! # 放弃对当前文件的修改,返回到上一个文件
:e!   放弃对当前文件的修改重新载入当前文件上次保存过的版本
:w %.new  保存当前修改到当前文件名.new的一个文件中去

如果没有首先保存当前文件,并且没有在:e和:n后面添加!来命令vi变换当前文件,那么将不允许使用上述命令来文件之间切换。

在vi中也可以使用CTRL+^ 在文件间来回切换。这个命令与:e #相同。但是对当前文件也要保存或者放弃保存,否则vi将不允许切换到前面的文件中去。

                    在文件之间进行编辑

当为复制缓冲区指定了单字母名时,就拥有了把文本从一个文件移动到另一个文件的便捷方法。当使用:e命令把一个新的文件加载到vi缓冲区时,将不会清除命名的缓冲区。因此,通过从一个文件中复制和删除文本,使用:e调用新的文件,然后把命名缓冲区展提到新的文件中,这样就可以在文件间传输文本了。

"f4yy  复制四行到缓冲区f
"fp    把缓冲区中的文本粘贴到当前光标的下面

" 是什么??没有讲啊 

另一个方法 :ya 复制 :pu 粘贴

example
:160,224ya a 讲160行到224行之间的文本复制到缓冲区a中,接下来可以使用:e命令移动到想要放置这些行的文件
:pu a  把缓冲区a中的内容粘贴到当前行的后面

猜你喜欢

转载自blog.csdn.net/zgj289563749/article/details/21458869
今日推荐