编辑器ed介绍

 

编辑器ed介绍  

“标准”的UNIX文本编辑器是一个称为ed的程序,最初由Ken Thompson编写。ed是在70年代初期设计的,适用于那些在拥有以非常低速(每秒10到15个字符)运行的硬拷贝终端的小型机(第一个UNIX系统限制用户程序为8K字节)上的计算环境。它起源于当时很流行的早期编辑器qed。
随着技术的进步,ed基本保留了原来的风貌。几乎可以肯定在你使用的系统上可以找到其他具有诱人功能的编辑器,其中最常见的是“可见”或“全屏”的编辑机制,在这样的工具中你的终端屏幕可以反映你所做的编辑修改。
那么我们为什么还要花时间讨论这样一个过时的程序?答案是尽管有些陈旧,ed确实能够很好的完成某些功能。ed是在所有UNIX平台上都通用的工具,你可以确信当从一个系统移植到另一个系统上时它就在你的手边;它可以在低速电话线和任何类型的终端上良好的工作;它还可以很容易地从脚本中运行,大多数的屏幕编辑器采用自己驱动终端的方式,不能方便地从文件中获取输入。
ed为模式匹配提供正则表达式。基于ed的正则表达式渗透了整个UNIX系统:grep和sed使用的正则表达式几乎与ed完全相同;egrep、awk和lex扩展了ed的正则表达式;shell的文件名匹配正则表达式虽然语法不同但基本思想都是一致的。有些屏幕编辑器具有“行方式”以回到ed,以便使用正则表达式。
最后一点是ed运行得很快。调用ed程序、修改文件的某一行、保存该后的新版本之后退出ed,所有这些操作总共所花费的时间可能比一个较大的、引人入胜的全屏幕编辑器的启动时间还短。

A.1 基础
ed每次编辑一个文件。实际上它在文件的副本上工作,若要将所做的修改保存在原来的文件中,需要给出一个明确的命令。ed提供命令来操纵连续的行或与模式匹配的行,并在这些行上进行修改。
每个ed命令都是单个字符,通常是一个字母。多数命令前可冠以一个或两个行号,用于指明该命令涉及哪个或哪些行,否则使用缺省的行号。行号的说明可以用其在文件中的绝对位置(1,2,……)指定,其他特殊的行号有:符号$代表最后一行,.表示当前行或采用正则表达式的模式搜索得到的行,以及所有这些行号的组合。
让我们来看一下如何通过ed创建一个文件,仍采用第1章中De Morgan的诗句为例。
$ed poem
? poem
a
Great fleas hvae little fleas
upon their backs to bite 'em,
and little fleas have lesser fleas,
and so and infinitum.
.
w poem
121
q
$
命令a表示增加或添加行,添加方式由一个本身为.的行来结束。在ed中没有显示你正处于何种方式的标志,所以两种常见的错误是没有用a命令而键入文本以及在键入.之前键入命令。
ed不能自动地把文本写入文件,你必须用w命令来告诉它。如果试图在没有保存改变时使用退出命令q,ed会显示?给予警告,询问是否真要退出。此时,再键入q命令将直接退出编辑程序而不写文件,q命令表示无论有无改变均退出ed。
$ed poem
56
a
And the great fleas themselves, in turn,
have greater fleads to go on;
while these again have greater still,
and greater still, and so on.
.
q
?
w
200
q
$wc poem
6 35 200 poem
$

A.2 用!暂时进入shell
当你正使用ed时,可以暂时离开ed去运行一个shell命令,而不必退出ed。实施这个操作的ed命令是!。
$ed poem
200
!wc poem
6 35 200 poem
!
q

A.3 显示
文件的行号是以数字1、2、……编排的,可以用命令np或直接用数字n来显示第n行的内容,用m,np可显示行m到行n之间的内容。行号$表示最后一行,所以不必对行进行计数。
1 显示第1行,同1p
$ 显示最后一行,同$p
1,$p 从第1行开始显示到最后一行
可以按Return键每次显示一行,用命令-可以回退一行,行号还可以与符号+和-组合起来使用:
$-2,$p 显示最后3行
1,2+3p 显示第1行到第5行
但不能逆序或超越最后一行进行显示,例如命令$,$+1p和$,1p都是非法的。
显示命令l表示以所有字符都可见的方式显示文本内容,这在查找文件中的控制字符、区分空白与Tab等时很有用。

A.4 模式
一旦文件长度超过几行,通过显示所有的行以查找某个特定行就很麻烦,所以ed提供了一种匹配某个特定模式的搜索方法:/模式/,以查找指定模式的下一次出现。
$ed poem
200
/flea/    搜索下一包含flea的行
Great fleas have little fleas
/flea/    搜索下一包含flea的行
And the great fleas themselves, in turn,
//    搜索下一具有相同模式的行
have greater fleads to go on;
??    反向搜索具有相同模式的行
And the great fleas themselves, in turn,
ed能记住你上次使用的模式,所以可以只用//来重复搜索,反向搜索使用?模式?,或??。
用/.../和?...?的搜索在文本的任何一端将“回绕”(首尾相连)。
像/flea/这样的模式搜索如同1或$一样可以作为行号,也可用在同样的上下文中:
1,/flea/p 显示从第一行到下一flea出现的行
?flea?+1,$p 显示前一flea出现的行的下一行到文本最后一行

A.5 当前行
ed记录了最后操作所在的行:如最后显示、添加文本或读一个文件时的行号,这一行被命令为.,成为当前行。每个命令都对.有一个定义,通常是将其设置为该命令影响的最后一行,可以按照与行号$或1相同的方式使用.:
$ed poem
200
.   显示当前行,如同读以后的$
and greater still, and so on.
.-1,.p   显示前一行和当前行
while these again have greater still,
and greater still, and so on.
行号表达式可以用缩写形式:
缩写 等价于
- .-1
+ .+1
--或-2 .-2
++或+2 .+2
-n .-n
+n .+n
$- $-1
.3 .+3

A.6 添加、修改、删除、插入
添加命令a在指定的行后添加新行;删除命令d删除行;插入命令i在指定行前插入新行,而修改命令c则修改行,是删除和插入命令的组合。
na 在第n行后添加文本
ni 在第n行前插入文本
m,nd 删除第m行到第n行
m,nc 修改第m行到第n行
如果没有给出行号,则使用.,即对当前行进行操作。a、c和i命令的新文本内容也用本身为.的行结束,.是添加的最后一行。在删除命令后,.被设置成被删除的最后一行的下一行,除非超过$行号。
0a 在开始处添加文本(与1i相同)
dp 删除当前行,显示下一行(或为$时显示最后一行)
.,$dp 删除当前行到结束行,显示新的最后一行
1,$d 删除所有的内容
?模式?,.-1d 从上一个“模式”处删除到.之前的一行
$dp 删除最后一行,并显示新的最后一行
$c 修改最后一行($a表示在最后一行后面添加文本)
1,$c 修改所有的行

A.7 替换、取消
仅仅为了修改其中的几个字符而重新键入一整行是很痛苦的,替换命令s用于将某个字符串替换成另一个字符串:
s/old/new/ 把当前行中的第一个old改成new
s/old/new/p 把第一个old改成new,并显示相应行
s/old/new/g 把当前行中的每一个old改成new
s/old/new/gp 把每一个old改成new,并显示相应行
除非跟着命令g,否则只有行中最左边出现的模式被替换,s命令本身并不显示被修改的行,除非后面使用p。事实上,大多数的ed命令都是默默地工作,但几乎任何命令后都可以用p来显示结果。
如果替换没有按你所期望的那样做,可使用取消命令u来取消最近的替换。.必须被设置为被替换的行。
u 取消最近的替换
up 取消最近的替换并显示
正如p和d命令前可以冠以一个或两个行号以表示受影响的行一样,s命令也可以这样使用:
/old/s/old/new/ 查找下一个old,并替换成new
/old/s//new 查找下一个old,并替换成new
   (模式已被记住)
1,$s/old/new/p 把每一行的第一个old替换成new,并显示最后被改变的行
1,$s/old/new/gp 把每一行的每一个old替换成new,并显示最后被改变的行
注意1,$s表示将s命令应用于每一行,但是它仍只表示替换每行最左边的匹配模式字符串,若要替换每行中的所有的模式字符串,则需要后续的g,此外p只显示最后受影响的行,要显示所有改变的行则需要全局命令,稍后我们将作介绍。
字符&是一个缩写,如果它出现在一个s命令的右边某处,则表示与左边匹配的内容。
s/big/very &/ 用very big替换big
s/big/& &/ 用big big替换big
s/.*/(&)/ 把整行用括号括起来
s/and/\&/ 用&(\用于取消特殊含义)替换and

A.8 元字符和正则表达式
在shell中,符号*、>和|有特殊含义,同样,当ed中的某些字符出现在一个搜索模式或s命令的左边部分时,也具有特殊意义。这类字符称为元字符,而使用它们的模式称为正则表达式。表A-1列出了这些字符及其含义,下面的例子应与该表结合起来阅读。任何字符前冠以反斜线符号可以取消其特殊含义。
表A-1 编辑器正则表达式
字符 含义
------------------------------------------------------------
c 任何非特殊字符c都与自身匹配
\c 关闭字符c的特殊含义
^ 当模式以^开始时,匹配行首
$ 当模式以$结束时,匹配行尾
. 匹配任何单个字符
[...] 匹配...中的任何一个字符,像a-z这样的字符范围是合法的
[^...] 匹配不再...中的任何字符,范围是合法的
r* 匹配0个或多个r,其中r为一个字符、.或[...]
& 只在s的右边出现,代表匹配的模式
\(...\) 标记正则表达式;匹配的字符串可在其左右两边,如\1等等。
------------------------------------------------------------
注:没有匹配换行的正则表达式

模式 匹配内容
------------------------------------------------------------
/^$/ 空行,即只有换行
/./ 非空行,即至少包含一个字符
/^/ 所有行
/thing/ 包含thing的行
/^thing/ 行首为thing的行
/thing$/ 行尾为thing的行
/^thing$/ 只包含thing的行
/thing.$/ 行尾为thing加上任意一个字符
/thing\.$/ 行尾为thing.
/\thing\// 包含/thing/的行
/[tT]hing/ 包含Thing或thing的行
/thing[0-9]/ thing后跟一个数字
/thing[^0-9]/ thing后跟一个非数字
/thing[0-9][^0-9]/ thing后跟一个数字及一个非数字
/thing1.*thing2/ thing1之后为任意字符串,然后为thing2
/^thing1.*thing2$/ 行首为thing1,行尾为thing2
------------------------------------------------------------
包含*的正则表达式匹配最左边最长的串,注意x*可以匹配0个字符,而xx*匹配一个或多个。

A.9 全局命令
全局命令g和v适用于由正则表达式选择的多行的一个或多个其它命令。g命令最常用于多行的显示、替换或删除:
m,ng/re/命令 对m和n之间的所有与re匹配的行执行操作cmd
m,ng/re/命令 对m和n之间的所有不与re匹配的行执行操作cmd
g或v命令之前可以冠以行号来限制范围,缺省范围为1,$。
g/.../p 显示所有与正则表达式...匹配的行
g/.../d 删除所有与...匹配的行
g/.../s//repl/p 用repl替换每行中第一个...,并显示被改变的行
g/.../s//repl/gp 用repl替换每一个...,并显示被改变的行
g/.../s/pat/repl/ 对匹配...的行,用repl替换第一个pat
g/.../s/pat/repl/p 对匹配...的行,用repl替换第一个pat,并显示
g/.../s/pat/repl/gp 对匹配...的行,用repl替换所有pat,并显示
v/.../s/pat/repl/gp 对不匹配...的行,用repl替换所有pat,并显示
v/^&/p 显示所有的非空行
g/.../cmd1\cmd1\cmd3 用一个g命令实施多个命令;除了最后一个命令,在每个命令后添加\
由g或v命令所控制的命令也可以使用行号,.被设置为每个被选中的行。
g/thing/,.+1p 显示每个包含thing的行及其下以行
g/^\.EQ/.1,/^\.EN/-s/alpha/beta/gp 只把.EQ和.EN之间的alpha改称beta,并显示被改变的行。

A.10 移动和复制行
命令m移动一组连续的行,命令t可复制一组行到指定地方。
m,nmd 把第m行到第n行移到第d行之后
m,ntd 把第m行到第n行复制到第d行之后
如果没有指定源文本行,则可使用.(当前行)。目的行d不能落在范围m,n-1之内。下面是使用m和t是的习惯用法:
m+ 把当前行移到下一行之后(互换)
m-2 把当前行移到上一行之前
m-- 同上
m- 什么也不做
m$ 把当前行移到结尾(m0移到文本开始处)
t. 复制到当前行(t$复制到结尾处)
-,.t. 复制上一行和当前行
1,$t$ 复制所有行
g/^/m0 将行逆序

A.11 标记和行号
命令=显示最后以行($)的行号(一个糟糕的缺省方式);.=则显示当前行的行号,等等,显示后,当前行不改变。
命令kc用小写字母c标记被定位的行,以后可以用'c来指定该行,k命令不改变当前行。标记适用于文本的大块移动,因为它们(指标记)保持在行上不变,如下面的序列:
/.../ka 查找行...并标记为a
/.../kb 查找行...并标记为b
'a,'bp 显示整个范围以确认
/.../ 查找目标行
'a,'bm. 把选中的行移到其后

A.12 连接、分解和重组行
行可通过j命令(没有附加的空格)连接起来:
m,nj 把第m行到第n行连接成一行
缺省的范围是.,.+1,所以
jp 把当前行于下一行连接并显示
-,.jp 把上一行于当前行连接并显示
用替换命令插入一个换行来对行进行分解:
s/part1paet2/part1\ 把行分解成两行
part2\
s/ /\ 把每个空格替换成行,使每行只包含一个单词
/g
当前行被设置成新创建的最后一行。
若涉及匹配正则表达式的一部分而不是整个的话,可使用带标记的正则表达式:如果一个正则表达式中出现结构\(...\),则匹配的整个表达式的这一部分可以用\1表示,它可以出现在结构的左右两边。最多可以有九个标记表达式,分别记为\1、\2,等等。
s/\(...\)\(.(*\)/\2\1/ 把开始三个字符移到行尾
/\(..*\)\1) 查找一个包含相邻的重复字符串的行

A.13 文件处理命令
读和写命令r和w前可冠以行号:
nr file   读文件,将其添加在行n之后,把当前行设置成读取的最后一行
m,nw file 把行m到行n写到文件中,不改变当前行
m,nW file 把行m到行n添加到文件后,不改变当前行
w和W命令的缺省范围是整个文件;r命令中n的缺省是$,一个不太好的选择,请小心。
ed记得使用的第一个文件名,或者是从命令行中得知,或者是从r或w命令中获得。文件命令f显示或改变被记住的文件名:
f 显示被记住的文件名
f file 设置被记住的文件名
编辑命令e用记住的文件或新的文件来重新设置ed:
e 开始编辑被记住的文件
e file 开始编辑file
e命令的保护方式同q命令:如果你没有写出你的改变,第一个e将引起一个错误信息,E则无论有无改变均重置ed。在某些系统上,ed连接到e上以便在编辑器内外均可使用相同的命令(e 文件名)。

A.15 命令小结
表A-2是ed命令的小结,表A-3则列出了有效行号的表示法。每个命令前可冠以零个、一个或两个行号,用以指明可提供的文本行范围以及没有指定时的缺省值。多数命令后可跟随命令p来显示最后受影响的行,或跟一个l命令来把最后受影响的行中不可见字符标记成可见的。.(当前行)通常被设置为最后受影响的行,但不受f,k,w,x,=和!命令的影响。
表A-2 ed命令一览表
-----------------------------------------------------------------------
命令 含义
-----------------------------------------------------------------------
.a
.,.c
.,.d
e file
f file
1,$g/reg/cmd
.i
.,.+1j
.kc
.,.l
.,.m n
.,.p
q
$r file
.,.s/reg/new/
.,.t n
.u
1,$v/reg/cmd
1,$w file
$=
! cmd
(.+1)
-----------------------------------------------------------------------

表A-3 ed行号表示法一览表
-----------------------------------------------------------------------
表示法 含义
-----------------------------------------------------------------------
n
.
$
/reg/
?reg?
'c
n1+n
n1,n2
n1;n2
-----------------------------------------------------------------------

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值