现在的位置: 首页 > 综合 > 正文

sed命令详解

2013年10月07日 ⁄ 综合 ⁄ 共 15800字 ⁄ 字号 评论关闭

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。不同的UNIX系统所附的sed版本亦不尽相同。若读者所使用的UNIX

  系统上未附有sed,则可透过anonymousftp到下列地方去取得:

  phi.sinica.edu.tw:/pub/GNU/gnu

  gete.sinica.edu.tw:/unix/gnu

  ftp.edu.tw:/UNIX/gnu

  ftp.csie.nctu.edu.tw:/pub/Unix/GNU

  ftp.fcu.edu.tw:/pub3/UNIX/gnu

  axp350.ncu.edu.tw:/Packages/gnu

  leica.ccu.edu.tw:/pub2/gnu

  mail.ncku.edu.tw:/pub/unix/gnu

  bbs.ccit.edu.tw:/pub1/UNIX/gnu

  prep.ai.mit.edu.tw:/pub/gnu

  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(参照[section4.1]);

  表示替换资料行、或资料区的指令中的函数参数为c(参照[section4.5])。上述情况以下面三个例子说明。上述情况

  以下面三个例子说明。

  例一.将文件中含"machine"字串的资料行中的"phi"字串,替换成为"beta"字串。其命令列如下:

  sed-e'/machine/s/phi/beta/g'input.dat(以後文件档都以input.dat代表)

  例二.将文件中第5行资料,替换成句子"Thosewhoinquarrelsinterpose,mustoftenwipeabloodynose."。

  其命令列如下

  sed-e'5c

  Thosemustoftenwipeabloodynose.

  'input.dat

  例三.将文件中1至100行的资料区,替换成如下两行资料:

  Howareyou?

  databedeleted!

  则其命令列如下

  sed-e'1,100c

  Howareyou?

  databedeleted!

  'input.dat

  3.2搬动文件中的资料

  使用者可用sed中的holdspace暂存编辑中的资料、用函数参数w(参照[section4.9])将文件资料搬动到它档内储存、

  或用函数参数r(参照[section4.8])将它档内容搬到文件内。Holdspace是sed用来暂存patternspace内资料的暂

  存器,当sed执行函数参数h、H(参照[section4.19])时,会将patternspace资料暂存到holdspace;当执行函

  数参数x、g、G(参照[section4.22])时,会将暂存的资料取到patternspace。下面举三个例子说明。

  例一.将文件中的前100资料,搬到文件中第300後输出。其命令列如下:

  sed-fmov.scr文件档

  mov.scr档的内容为

  1,100{

  H

  d

  }

  300G

  其中,

  1,100{

  H

  d

  }

  它表示将文件中的前100资料,先储存(参照[section4.19])在holdspace之後删除;指令300G(参照[section4.22])

  表示,将holdspace内的资料,添加在文件中的第300资料後输出。

  例二.将文件中含"phi"字串的资料行,搬至mach.inf档中储存。其命令列如下:

  sed-e'/phi/wmach.inf'文件档

  例三.将mach.inf档内容,搬至文件中含"beta"字串的资料行。其命令列如下:

  sed-e'/beta/rmach.inf'文件档

  另外,由於sed是一stream(参照[section1.4])编辑器,故理论上输出後的文件资料不可能再搬回来编辑。

  3.3删除文件中的资料

  因为sed是一行编辑器,所以sed很容易删除个别资料行或整个资料区。一般用函数参数d(参照[section4.2])或

  D(参照[section4.17])来表示。下面举两个例子说明。

  将文件内所有空白行全部删除。其命令列为

  sed-e'/^$/d'文件档

  regularexpression(解[附录A]),^$表示空白行。其中,^限制其後字串必须在行首;$限制其前字串必须在行尾。

  将文件内连续的空白行,删除它们成为一行。其命令列为

  sed-e'/^$/{

  N

  /^$/D

  }'文件档

  其中,函数参数N(参照[section4.16])表示,将空白行的下一行资料添加至patternspace内。函数参数/^$/D表示,

  当添加的是空白行时,删除第一行空白行,而且剩下的空白行则再重新执行指令一次。指令重新执行一次,删除一行空白行,

  如此反覆直至空白行後添加的为非空白行为止,故连续的空白行最後只剩一空白行被输出。

  3.4搜寻文件中的资料

  Sed可以执行类似UNIX命令grep的功能。理论上,可用regularexpression(参照[附录A])。例如,将文件中含

  有"gamma"字串的资料行输出。则其命令列如下:

  sed-n-e'/gamma/p'文件档

  但是,sed是行编辑器,它的搜寻基本上是以一行为单位。因此,当一些字串因换行而被拆成两部份时,一般的方法

  即不可行。此时,就必须以合两行的方式来搜寻这些资料。其情况如下面例子:

  例.将文件中含"omega"字串的资料输出。其命令列如下

  sed-fgp.scr文件档

  gp.scr档的内容如下:

  /omega/b

  N

  h

  s/.*

  //

  /omega/b

  g

  D

  在上述sedscrīpt(解[10]),因藉着函数参数b形成类似C语言中的casestatement结构,使得sed可分别处理当

  资料内含"omega"字串;当"omega"字串被拆成两行;以及资料内没有"omega"字串的情况。接下来就依上述的三种情

  况,将sedscrīpt分成下面三部份来讨论。

  当资料内含"omega",则执行编辑指令

  /omega/b

  它表示当资料内含"omega"字串时,sed不用再对它执行後面的指令,而直接将它输出。

  当资料内没有"omega",则执行编辑指令如下

  N

  h

  s/.*

  //

  /omega/b

  其中,函数参数N(参照[section4.16]),它表示将下一行资料读入使得patternspace内含前後两行资料。函数参

  数h(参照[section4.19]),它表示将patternspace内的前後两行资料存入holdspace。函数参数s/.*

  //,它

  表示将patternspace内的前後两行资料合(解[11])成一行。/omega/b,它表示如果合後的资料内含"omega"字

  串,则不用再执行它之後的指令,而将此资料自动输出;

  当合後的资料依旧不含"omega",则执行编辑指令如下

  g

  D

  其中,函数参数g(参照[section4.21]),它表示将holdspace内合前的两行资料放回patternspace。函数参数

  D(参照[section4.17]),它表示删除两行资料中的第一行资料,并让剩下的那行资料,重新执行sedscrīpt。如此,

  无论的资料行内或行间的字串才可搜寻完全。

  SED手册-4.介绍函数参数

  http://phi.sinica.edu.twaspac@phi.sinica.edu.tw(2001-07-3007:00:00)

  本章将以一节一个函数参数的方式,介绍所有sed提供的函数参数,其中有

  |s|d|a|i|c|p|l|r|w|y|!|n|q|=|#|N|D|P|h|H|g|G|x|b|t|

  另外,在各节中,首先简单介绍函数参数功能,接着说明函数参数与位址参数配合的格式,而其中也一描述

  sed执行此函数参数的工作情形。

  4.1s

  函数参数s表示替换(substitute)文件内字串。其指令格式如下:

  [address1[,address2]]s/pattern/replacemen/[flag]

  对上述格式有下面几点说明:

  函数参数s最多与两个位址参数配合。

  关於"s/pattern/replacement/[flag]"(解[12])有下面几点说明:

  pattern:它为regulerexpression字串。它表示文件中要被替换的字串。

  replacement:它为一般字串。但其内出现下列字元有特别意义:

  &:代表其前pattern字串。例如

  sed-e's/test/&mycar/'资料档名

  指令中,&代表pattern字串"test"。故执行後,资料档的"test"被替换成"testmycar"。

  :代表pattern中被第n个(、)(参照[附录A])所括起来的字串。例如

  sed-e's/(test)(my)(car)/[231]/'资料档名

  指令中,1表示"test"、2表示"my"、1表示"car"字串。故执行後,资料档的"testmycar"被替换

  成"[mycartest]"。

  :可用它来还原一些特殊符号(如上述的&与)本身字面上的意义,或用它来代表换行。

  flag:主要用它来控制一些替换情况:

  当flag为g时,代表替换所有符合(match)的字串。

  当flag为十进位数字m时,代表替换行内第m个符合的字串。

  当flag为p时,代表替换第一个符合pattern的字串後,将资料输出标准输出档。

  当flag为wwfile时,代表替换第一个符合pattern的字串後,输出到wfile档内(如果wfile不存在,则会

  重新开启名为wfile的档案)。

  当没有flag时,则将资料行内第一个符合pattern的字串以replacement字串来替换。

  delimiter:在"/pattern/replace/[flag]"中"/"被当成一delimiter。除了空白(blank)、换行(newline)之外,

  使用者可用任何字元作为delimiter。例如下述编辑指令

  s#/usr#/usr1#g

  上述命令中verb|#|为delimiter。如果用"/"做delimiter,则sed会将pattern与replacement中的"/"

  当成delimiter而发生错误。

  例:

  题目:替换input.dat档(後面如果没有特别指定,均假设文件档名为input.dat)内"1996"字串成"1997",同时

  将这些资料行存入year97.dat档内。

  说明:用函数参数s指示sed将"1996"字串替换成"1997",另外用sargument中的flagw指示sed将替换

  过的资料行存入year97.dat档内。

  sed命令列:

  sed-e's/1996/1997/wyear97.dat'input.dat

  4.2d

  函数参数d表示删除资料行,其指令格式如下:

  [address1[,address2]]d

  对上述格式有下面几点说明:

  函数参数d最多与两个位址参数配合。

  sed执行删除动作情况如下:

  将patternspace内符合位址参数的资料删除。

  将下一笔资料读进patternspace。

  重新执行sedscrīpt。

  例:可参考section3.3。

  4.3a

  函数参数a表示将资料添加到文件中。其指令格式如下:

  [address1]a使用者所输入的资料

  对上述格式有下面几点说明:

  函数参数a最多与一个位址参数配合。

  函数参数a紧接着""字元用来表示此行结束,使用者所输入的资料必须从下一行输入。如果资料超过一行,则须在

  每行的结尾加入""。

  sed执行添加动作情况如下:当patternspace内资料输出後,sed跟着输出使用者所输入的资料。

  例:

  题目:添加"多工作业系统"在含"UNIX"字串的资料行後。假设input.dat档的内容如下:

  UNIX

  说明:用函数参数a将所输入的资料添加在含"UNIX"字串的资料行後。

  sed命令列如下:

  sed-e'/UNIX/a

  多工作业系统

  'input.dat

  执行上述命令後,其输出结果如下:

  UNIX

  多工作业系统

  4.4i

  函数参数i表示将资料插入文件中。其指令格式如下:

  [address1]i使用者所输入的资料

  对上述格式有下面几点说明:

  函数参数i最多与一个位址参数配合。

  函数参数i紧接着""字元用来表示此行结束,使用者所输入的资料必须从下一行输入。如果资料超过一行,则须在

  每行的结尾加入""。

  sed执行插入动作的情况如下:在patternspace内资料输出前,sed先输出使用者所输入的资料。

  例:

  题目:将"文章版权属於中央研究院"插在input.dat档中含"院长:李远哲"的资料行之前。假设input.dat档内

  容如下:

  院长:李远哲

  说明:用函数参数i将资料行"文章版权属於中央研究院"插在含"院长:李远哲"的资料行之前。

  sed命令列如下:

  sed-e'/院长:李远哲/i

  文章版权属於中央研究院

  'input.dat

  执行上述命令後的输出如下:

  文章版权属於中央研究院

  院长:李远哲

  4.5c

  函数参数c表示改变文件中的资料。其格式如下:

  [address1[,address2]]c使用者所输入的资料

  对上述格式有下面几点说明:

  函数参数c最多与两个位址参数配合。

  函数参数c紧接着""字元用来表示此行结束,使用者所输入的资料必须从下一行输入。如果资料超过一行,则须在

  每行的结尾加入""。

  sed执行改变动作的情况:在patternspace内资料输出时,sed改变它成为使用者所输入的资料。

  例:参考section3.1之例二、三。

  4.6p

  函数参数p表示印出资料。其指令格式如下:

  [address1[,address2]]p

  对於上述格式有下面几点说明:

  函数参数p最多与两个位址参数配合。

  sed执行印出动作的情况如下:sed拷备一份patternspace内容至标准输出档。

  例:参考section3.4开头的内容。

  4.7l

  函数参数l,除可将资料中的nonprintingcharacter以ASCII码列出外,其於均与函数参数p相同。例如,将下

  面input.dat档中的^[以ASCII码印出

  TheGreat^[isamoviestarringSteveMcQueen.

  执行命令sed-e'l'input.dat後,则输出结果如下:

  TheGreat

1. Sed简介

2. 定址

3. Sed命令

4. 选项

5. 元字符集

6. 实例

7. 脚本

1. Sed简介

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。以下介绍的是Gnu版本的Sed 3.02。

2. 定址

可以通过定址来定位你所希望编辑的行,该地址用数字构成,用逗号分隔的两个行数表示以这两行为起止的行的范围(包括行数表示的那两行)。如1,3表示1,2,3行,美元符号($)表示最后一行。范围可以通过数据,正则表达式或者二者结合的方式确定 。

3. Sed命令

调用sed命令有两种形式:

*

sed [options] 'command' file(s)

*

sed [options] -f scrīptfile file(s)

a/

在当前行后面加入一行文本。

b lable

分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾。

c/

用新的文本改变本行的文本。

d

从模板块(Pattern space)位置删除行。

D

删除模板块的第一行。

i/

在当前行上面插入文本。

h

拷贝模板块的内容到内存中的缓冲区。

H

追加模板块的内容到内存中的缓冲区

g

获得内存缓冲区的内容,并替代当前模板块中的文本。

G

获得内存缓冲区的内容,并追加到当前模板块文本的后面。

l

列表不能打印字符的清单。

n

读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。

N

追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。

p

打印模板块的行。

P(大写)

打印模板块的第一行。

q

退出Sed。

r file

从file中读行。

t label

if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

T label

错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。

w file

写并追加模板块到file末尾。

W file

写并追加模板块的第一行到file末尾。

!

表示后面的命令对所有没有被选定的行发生作用。

s/re/string

用string替换正则表达式re。

=

打印当前行号码。

#

把注释扩展到下一个换行符以前。

以下的是替换标记

*

g表示行内全面替换。

*

p表示打印行。

*

w表示把行写入一个文件。

*

x表示互换模板块中的文本和缓冲区中的文本。

*

y表示把一个字符翻译为另外的字符(但是不用于正则表达式)

4. 选项

-e command, --expression=command

允许多台编辑。

-h, --help

打印帮助,并显示bug列表的地址。

-n, --quiet, --silent

取消默认输出。

-f, --filer=scrīpt-file

引导sed脚本文件名。

-V, --version

打印版本和版权信息。

5. 元字符集^

锚定行的开始 如:/^sed/匹配所有以sed开头的行。

$

锚定行的结束 如:/sed$/匹配所有以sed结尾的行。

.

匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。

*

匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。

[]

匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。

[^]

匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。

/(../)

保存匹配的字符,如s//(love/)able//1rs,loveable被替换成lovers。

&

保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。

/<

锚定单词的开始,如://<love/匹配包含以love开头的单词的行。

/>

锚定单词的结束,如/love/>/匹配包含以love结尾的单词的行。

x/{m/}

重复字符x,m次,如:/0/{5/}/匹配包含5个o的行。

x/{m,/}

重复字符x,至少m次,如:/o/{5,/}/匹配至少有5个o的行。

x/{m,n/}

重复字符x,至少m次,不多于n次,如:/o/{5,10/}/匹配5--10个o的行。

6. 实例

删除:d命令

*

$ sed '2d' example-----删除example文件的第二行。

*

$ sed '2,$d' example-----删除example文件的第二行到末尾所有行。

*

$ sed '$d' example-----删除example文件的最后一行。

*

$ sed '/test/'d example-----删除example文件所有包含test的行。

替换:s命令

*

$ sed 's/test/mytest/g' example-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。

*

$ sed -n 's/^test/mytest/p' example-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。

*

$ sed 's/^192.168.0.1/&localhost/' example-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加 localhost,变成192.168.0.1localhost。

*

$ sed -n 's//(love/)able//1rs/p' example-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。

*

$ sed 's#10#100#g' example-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。

选定行的范围:逗号

*

$ sed -n '/test/,/check/p' example-----所有在模板test和check所确定的范围内的行都被打印。

*

$ sed -n '5,/^test/p' example-----打印从第五行开始到第一个包含以test开始的行之间的所有行。

*

$ sed '/test/,/check/s/$/sed test/' example-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。

多点编辑:e命令

*

$ sed -e '1,5d' -e 's/test/check/' example-----(-e)选项允许在同一行里执行多条命令。如例子所示,第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。

*

$ sed --expression='s/test/check/' --expression='/love/d' example-----一个比-e更好的命令是--expression。它能给sed表达式赋值。

从文件读入:r命令

*

$ sed '/test/r file' example-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。

写入文件:w命令

*

$ sed -n '/test/w file' example-----在example中所有包含test的行都被写入file里。

追加命令:a命令

*

$ sed '/^test/a//--->this is a example' example<-----'this is a example'被追加到以test开头的行后面,sed要求命令a后面有一个反斜杠。

插入:i命令

$ sed '/test/i//

new line

-------------------------' example

如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。

下一个:n命令

*

$ sed '/test/{ n; s/aa/bb/; }' example-----如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续。

变形:y命令

*

$ sed '1,10y/abcde/ABCDE/' example-----把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。

退出:q命令

*

$ sed '10q' example-----打印完第10行后,退出sed。

保持和获取:h命令和G命令

*

$ sed -e '/test/h' -e '$G example-----在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。

保持和互换:h命令和x命令

*

$ sed -e '/test/h' -e '/check/x' example -----互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换。

7. 脚本

Sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。

抱歉!评论已关闭.