|
Sed(StreamEDitor)为UNIX系统上提供将编辑工作自动化的编辑器,使用者无需直接编辑资料。使用者可
利用sed所提供20多种不同的函数参数,组合(解[1])它们完成不同的编辑动作。此外,由於sed都
以行为单位编辑文件,故其亦是行编辑器(lineeditor)。
一般sed最常用在编辑那些需要不断重覆某些编辑动作的文件上,例如将文件中的某个字串替换成另一个字
串等等。这些相较於一般UNIX编辑器(交谈式的,如vi、emacs)用手动的方式修改文件,sed用起来较省力。
下面几节将分别介绍:
何时使用sed
何处获得sed
sed能做那些编辑动作
sed如何工作
1.1何时使用sed
在修改文件时,如果不断地重覆某些编辑动作,则可用sed自动一次执行这些编辑动作。例如要使received
档内1000封电子信件内的发信人属名"Tom"改成"John",此时只要在命令列上执行一简单的sed命令就可
把档内所有的"Tom"字串替换成"John"。
再者,当文件需要许多不同编辑动作时,则sed一次可执行那些不同的编辑动作。例如sed能一次执行完将
文件中所有空白行删除、替换字串、并将使用者输入的文字添加在文件的第六行等等不同的编辑动作。
1.2何处获得sed
一般的UNIX系统,本身即附有sed。veket系统本身已经自带。
1.3sed能做那些编辑动作
sed可删除(delete)、改变(change)、添加(append)、插入(insert)、合、交换文件中的资料行,或读入其它
档的资料到文件中,也可替换(substuite)它们其中的字串、或转换(tranfer)其中的字母等等。例如将文件中的
连续空白行删成一行、"local"字串替换成"remote"、"t"字母转换成"T"、将第10行资料与第11资料合
等。
1.4sed如何工作
如同其它UNIX命令,sed由标准输入读入编辑文件并由标准输出送出结果。下图表示sed将资料行"Unix"替
换成"UNIX",
在图中,上方standardinput为标准输入,是读取资料之处;standardoutput为标准输出,是送出结果之处;
中间sed方块的下面两个虚线方块表示sed的工作流程。其中,左边虚线方块表示sed将标准输入资料置入
patternspace,右边虚线方块表示sed将patternspace中编辑完毕后的资料送到标准输出。
在虚线方块中,两个实线方块分别表示patternspace与sedscrīpt。其中,patternspace为一缓区,它是
sed工作场所;而sedscrīpt则表示一组执行的编辑指令。
在图中,左边虚线方块"Unix"由标准输入置入patternspace;接着,在右边虚线方块中,sed执行sedscrīpt
中的编辑指令s/Unix/UNIX/(解[2]),结果"Unix"被替换成"UNIX",之后,"UNIX"由patternspace送到
标准输出。
总合上述所言,当sed由标准输入读入一行资料并放入patternspace时,sed依照sedscrīpt的编辑指令逐
一对patternspace内的资料执行编辑,之后,再由patternspace内的结果送到标准输出,接着再将下一行资
料读入。如此重执行上述动作,直至读完所有资料行为止。
SED手册-2.使用sed
http://phi.sinica.edu.twaspac@phi.sinica.edu.tw(2001-07-2909:05:00)
Sed命令列可分成编辑指令与文件档部份。其中,编辑指令负责控制所有的编辑工作;文件档表示所处理的档案。
sed的编辑指令均由位址(address)与函数(function)两部份组成,其中,在执行时,sed利用它的位址参数来
决定编辑的对象;而用它的函数参数(解[3])编辑。
此外,sed编辑指令,除了可在命令列上执行,也可在档案内执行。其中差别只是在命令列上执行时,其前必
须加上选项-e;而在档案(解[4])内时,则只需在其档名前加上选项-f。另外,sed执行编辑指令是依照它
们在命令列上或档内的次序。
下面各节,将介绍执行命令列上的编辑指令、sed编辑指令、执行档案内的编辑指令、执行多个档案的编辑、及
执行sed输出控制。
2.1执行命令列上的编辑指令
2.2sed编辑指令
2.3执行档案内的编辑指令
2.4执行多个档案的编辑
2.5执行sed输出控制
2.1.执行命令列上的编辑指令
当编辑指令(参照[section2.2])在命令列上执行时,其前必须加上选项-e。其命令格式如下:
sed-e'编辑指令1'-e'编辑指令2'...文件档
其中,所有编辑指令都紧接在选项-e之后,并置於两个"'"特殊字元间。另外,命令上编辑指令的执行是由
左而右。
一般编辑指令不多时,使用者通常直接在命令上执行它们。例如,删除yel.dat内1至10行资料,并将其
馀文字中的"yellow"字串改成"black"字串。此时,可将编辑指令直接在命令上执行,其命令如下:
sed-e'1,10d'-e's/yellow/black/g'yel.dat
在命令中,编辑指令'1,10d'(解[5])执行删除1至10行资料;编辑指令's/yellow/black/g'(解[6]),
"yellow"字串替换(substuite)成"black"字串。
2.2sed的编辑指令
sed编辑指令的格式如下:
[address1[,address2]]function[argument]
其中,位址参数address1、address2为行数或regularexpression字串,表示所执行编辑的资料行;函数参
数function[argument]为sed的内定函数,表示执行的编辑动作。
下面两小节,将仔细介绍位址参数的表示法与有哪些函数参数供选择。
2.2.1位址(address)参数的表示法
实际上,位址参数表示法只是将要编辑的资料行,用它们的行数或其中的字串来代替表示它们。下面举几个例子
说明(指令都以函数参数d(参照[section4.2])为例):
删除档内第10行资料,则指令为10d。
删除含有"man"字串的资料行时,则指令为/man/d。
删除档内第10行到第200行资料,则指令为10,200d。
删除档内第10行到含"man"字串的资料行,则指令为10,/man/d。
接下来,以位址参数的内容与其个数两点,完整说明指令中位址参数的表示法(同样也以函数参数d为例)。
位址参数的内容:
位址为十进位数字:此数字表示行数。当指令执行时,将对符合此行数的资料执行函数参数指示的编辑动作。例如,
删除资料档中的第15行资料,则指令为15d(参照[section4.2])。其馀类推,如删除资料档中的第m行资料,则
指令为md。
位址为regularexpression(参照[附录A]):
当资料行中有符合regularexpression所表示的字串时,则执行函数参数指示的编辑动作。另外,在
regularexpression前后必须加上"/"。例如指令为/t.*t/d,表示删除所有含两"t"字母的资料行。其中,"."
表示任意字元;"*"表示其前字元可重任意次,它们结合".*"表示两"t"字母间的任意字串。
位址参数的个数:在指令中,当没有位址参数时,表示全部资料行执行函数参数所指示的编辑动作;当只有一位址
参数时,表示只有符合位址的资料行才编辑;当有两个位址参数,如address1,address2时,表示对资料区执行
编辑,address1代表起始资料行,address2代表结束资料行。对於上述内容,以下面例子做具说明。
例如指令为
d
其表示删除档内所有资料行。
例如指令为
5d
其表示删除档内第五行资料。
例如指令为
1,/apple/d
其表示删除资料区,由档内第一行至内有"apple"字串的资料行。
例如指令为
/apple/,/orange/d
其表示删除资料区,由档内含有"apple"字串至含有"orange"字串的资料行
2.2.2有那些函数(function)参数
下页表中介绍所有sed的函数参数(参照[chapter4])的功能。
函数参数功能
:label建立scrīptfile内指令互相参考的位置。
#建立解
{}集合有相同位址参数的指令。
!不执行函数参数。
=印出资料行数(linenumber)。
a添加使用者输入的资料。
blabel将执行的指令跳至由:建立的参考位置。
c以使用者输入的资料取代资料。
d删除资料。
D删除patternspace内第一个newline字母前的资料。
g拷贝资料从holdspace。
G添加资料从holdspace至patternspace。
h拷贝资料从patternspace至holdspace。
H添加资料从patternspace至holdspace。
l印出l资料中的nonprintingcharacter用ASCII码。
i插入添加使用者输入的资料行。
n读入下一笔资料。
N添加下一笔资料到patternspace。
p印出资料。
P印出patternspace内第一个newline字母前的资料。
q跳出sed编辑。
r读入它档内容。
s替换字串。
tlabel先执行一替换的编辑指令,如果替换成牛p>则将编辑指令跳至:label处执行。
w写资料到它档内。
x交换holdspace与patternspace内容。
y转换(transform)字元。
虽然,sed只有上表所述几个拥有基本编辑功能的函数,但由指令中位址参数和指令与指令间的配合,也能使
sed完成大部份的编辑任务。
2.3执行档案内的编辑指令
当执行的指令太多,在命令列上撰写起来十分混乱,此时,可将这些指令整理储存在档案
(譬如档名为scrīpt_file)内,用选项-fscrīpt_file,则让sed执行scrīpt_file内的编辑指令。其命
令的格示如下:
sed-fscrīpt_file文件档
其中,执行scrīpt_file内编辑指令的顺序是由上而下。例如上一节的例子,其可改成如下命令:
sed-fysb.scryel.dat
其中,ysb.scr档的内容如下:
1,10d
s/yellow/black/g
另外,在命令列上可混合使用选项-e与-f,sed执行指令顺序依然是由命令列的左到右,如执行至-f后
档案内的指令,则由上而下执行。
2.4执行多个文件档的编辑
在sed命令列上,一次可执行编辑多个文件档,它们跟在编辑指令之后。例如,替换
white.dat、red.dat、black.dat档内的"yellow"字串成"blue",其命令如下:
sed-e's/yellow/blue/g'white.datred.datblack.dat
上述命令执行时,sed依white.dat、red.dat、black.dat顺序,执行编辑指令s/yellow/blue/(请参照[section4.1],
进行字串的替换。
2.5.执行输出的控制
在命令列上的选项-n(解[7])表示输出由编辑指令控制。由前章内容得知,sed会"自动的"将资料由
patternspace输送到标准输出档。但藉着选项-n,可将sed这"自动的"的动作改成"被动的"由它所执行的
编辑指令(解[8])来决定结果是否输出。
由上述可知,选项-n必须与编辑指令一起配合,否则无法获得结果。例如,印出white.dat档内含有"white"
字串的资料行,其命令如下:
sed-n-e'/white/p'white.dat
上面命令中,选项-n与编辑指令/white/p(参照[section4.6])一起配合控制输出。其中,选项-n将输出控制权
移给编辑指令;/white/p将资料行中含有"white"字串印出萤幕。
SED手册-3.例
http://phi.sinica.edu.twaspac@phi.sinica.edu.tw(2001-07-2913:05:00)
一般在实际使用编辑器的过程中,常需要执行替换文件中的字串、搬移、删除、与搜寻资料行等等动作。
当然,一般交谈式编辑器(如vi、emacs)都能做得到上述功能,但文件一旦有大量上述编辑需求时,则
用它们编辑十分没有效率。本章将用举例的方式说明如何用sed自动执行这些编辑功能。此外,在本章
例中,均以下述方式描述文件的需求:
将文件中...资料,执行...(动作)
如此,目的是为了能将它们迅速的转成编辑指令。其中,"...资料"部份,转成指令中的位址参数表示;
"执行...动作"部份,则转成函数参数表示。另外,当"执行...动作"要由数个函数参数表示时,则可利
用"{"与"}"集合这些函数参数(解[9]),其指令形式如下:
位址参数{
函数参数1
函数参数2
函数参数3
.
:
}
上述指令表示,将对符合位址参数的资料,依次执行函数参数1、函数参数2、函数参数3...表示的动作。
下面各节,分别举例说明sed替换资料、移动、删除资料、及搜寻资料的命令。
3.1替换文件中的资料
3.2搬动文件中的资料
3.3删除文件中的资料
3.4搜寻文件中的资料
3.1替换文件中的资料
Sed可替换文件中的字串、资料行、甚至资料区。其中,表示替换字串的指令中的函数参数为s( |
|