SED手册

来源:本站原创 Linux 超过896 views围观 0条评论

第一章、介绍

Sed(Stream EDitor)是Unix系统上提供的将编辑工作自动化的编辑器,使用者无需直接编辑数据。使用者可利用sed所提供的20多种不同的函数参数,组合(注释[1])它们完成不同的编辑动作。此外,由于sed都以行为单位编辑文件,故它是行编辑器(line editor)。

一般sed最常用在编辑那些需要不断重复某些编辑动作的文件上,例如将文件中的某个字符串替换成另一个字符串等等。这些相较于一般Unix编辑器(交谈式的,如vi、emacs)用手动的方式修改文件,sed用起来较省力。下面几节将分别介绍:

何时使用sed

何处获得sed

sed能做哪些编辑动作

sed如何工作

1.1 何时使用sed

在修改文件时,如果不断地重复某些编辑动作,则可用sed自动一次执行这些编辑动作。例如要使received文件内1000封电子信件内的发信人属名"Tom"改成"John",此时只要在命令行上执行一简单的sed命令就可把文件内所有的"Tom" 字符串替换成"John"。

此外,当文件需要许多不同编辑动作时,则sed一次可执行那些不同的编辑动作。例如sed能一次执行完将文件中所有空白行删除、替换字符串、并将使用者输入的文字添加在文件的第6行等等不同的编辑动作。

1.2 何处获得sed

一般的Unix系统,本身即附有sed。不同的Unix系统所附的sed版本亦不尽相同。如果读者使用的Unix系统上没有sed,则可通过匿名ftp到下列地方去取得:

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.3 sed能做哪些编辑动作

sed可删除(delete)、改变(change)、添加(append)、插入(insert)、合并、交换文件中的数据行,或读入其它文件的数据到文件中,也可替换(substuite)它们其中的字符串、或转换(tranfer)其中的字母等等。例如将文件中的连续空白行删成一行、"local"字符串替换成"remote"、"t"字母转换成"T"、将第10行数据与第11数据合并等。

1.4 sed如何工作

如同其它Unix命令,sed由标准输入读入编辑文件并由标准输出送出结果。下图表示sed将数据行"Unix"替换成"UNIX",在图中,上方standard input为标准输入,是读取数据之处;standard output为标准输出,是送出结果之处;中间sed方块的下面两个虚线方块表示sed的工作流程。其中,左边虚线方块表示sed将标准输入数据置入pattern space,右边虚线方块表示sed将pattern space中编辑完毕后的数据送到标准输出。

在虚线方块中,两个实线方块分别表示pattern space与sed script。其中,pattern space为一缓冲区,它是sed工作场所;而sed script则表示一组执行的编辑指令。

在图中,左边虚线方块"Unix"由标准输入置入pattern space;接着,在右边虚线方块中,sed执行sed script中的编辑指令s/Unix/UNIX/(注释[2]),结果"Unix"被替换成"UNIX",之后,"UNIX"由pattern space送到标准输出。

综上所述,当sed由标准输入读入一行数据并放入pattern space时,sed依照sed script的编辑指令逐一对pattern space内的数据执行编辑,之后,再将pattern space内的结果送到标准输出,接着再将下一行数据读入。如此重复执行上述动作,直至读完所有数据行为止。

第二章、使用sed

Sed命令行可分成编辑指令与文件部分。其中,编辑指令负责控制所有的编辑工作;文件表示所处理的文件。sed的编辑指令均由位址(address)与函数(function)两部份组成,其中,在执行时,sed利用它的地址参数来决定编辑的对象;而用它的函数参数(注释[3])编辑。

此外,sed编辑指令,除了可在命令行上执行,也可在文件内执行。其中差别只是在命令行上执行时,其前必须加上选项-e;而在文件(注释[4])内时,则只需在其文件名前加上选项-f。另外,sed执行编辑指令是依照它们在命令行上或文件内的次序。

下面各节,将介绍执行命令行上的编辑指令、sed编辑指令、执行文件内的编辑指令、执行多个文件的编辑、及执行sed输出控制。

2.1 执行命令行上的编辑指令

2.2 sed编辑指令

2.3 执行文件内的编辑指令

2.4 执行多个文件的编辑

2.5 执行sed输出控制

2.1 执行命令行上的编辑指令

当编辑指令(参照[section 2.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.2 sed的编辑指令

sed 编辑指令的格式如下:

[address1[,address2]] function[argument]

其中,地址参数address1、address2为行数或regular expression字符串,表示所执行编辑的数据行;函数参数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。

地址为regular expression(参照[附录A]):

当数据行中有符合regular expression所表示的字符串时,则执行函数参数指示的编辑动作。另外,在regular expression前后必须加上"/"。例如指令为/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 建立script file内指令互相参考的位置。

# 建立注释。

{ } 集合有相同位址参数的指令。

! 不执行函数参数。

= 打印数据行数(line number)。

a\ 添加使用者输入的数据。

b label将执行的指令跳至由: label建立的参考位置。

c\ 以使用者输入的数据取代数据。

d 删除数据。

D 删除pattern space内第一个newline字母前的数据。

g 将hold space的数据拷贝到pattern space。

G 将hold space的数据添加到pattern space。

h 将pattern space的数据拷贝到hold space。

H 将pattern space的数据添加到hold space。

l 用ASCII码打印pattern space中的nonprinting character。

i\ 插入添加使用者输入的数据行。

n 读入下一笔数据到pattern space。

N 添加下一笔数据到pattern space。

p 打印数据。

P 打印pattern space内第一个newline字母前的数据。

q 跳出sed编辑。

r 读入其它文件内容。

s 替换字符串。

t label先执行一替换的编辑指令,如果替换成功,则将编辑指令跳至:label处执行。

w 写数据到其它文件内。

x 交换hold space与pattern space内容。

y 转换(transform)字符。

虽然sed只有上述几个拥有基本编辑功能的函数,但指令中位址参数和指令与指令间的配合,也能使sed完成大部分的编辑任务。

2.3 执行文件内的编辑指令

当执行的指令太多时,在命令行上写起来十分混乱。此时,可将这些指令整理储存在文件(譬如文件名为script_file)内,用选项-f script_file,则让sed执行script_file内的编辑指令。其命令的格示如下:

sed -f script_file 文件

其中,执行script_file内编辑指令的顺序是由上而下。例如上一节的例子,可改成如下命令:

sed -f ysb.scr yel.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.dat red.dat black.dat

上述命令执行时,sed依white.dat、red.dat、black.dat顺序,执行编辑指令s/yellow/blue/(请参照[section4.1],进行字符串的替换。

2.5 执行输出的控制

在命令行上的选项-n(注释[7])表示输出由编辑指令控制。由前章内容得知,sed会"自动"将数据由pattern space输送到标准输出文件。但借着选项-n,可将sed这"自动"的动作改成"被动",由它所执行的编辑指令(注释[8])来决定结果是否输出。也就是说,有了-n,原来缺省打印所有行变为不打印。

由上述可知,选项-n必须与编辑指令一起配合,否则无法获得结果。例如,打印white.dat文件内含有"white"字符串的数据行,其命令如下:

sed -n -e ‘/white/p’ white.dat

上面命令中,选项-n与编辑指令/white/p(参照[section4.6])一起配合控制输出。其中,选项-n将输出控制权移给编辑指令;/white/p将数据行中含有"white"字符串打印到屏幕上。

第三章、范例

一般在实际使用编辑器的过程中,常需要执行替换文件中的字符串、搬移、删除、与搜寻数据行等等动作。当然,一般交互式编辑器(如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行数据,替换成句子"Those who in quarrels interpose, must often wipe a bloody nose."。其命令行如下

sed -e ‘5c\

Those must often wipe a bloody nose.

‘ input.dat

例三、将文件中1至100行的数据区,替换成如下两行数据:

How are you?

data be deleted!

则其命令行如下

sed -e ‘1,100c\

How are you?\

data be deleted!

‘ input.dat

3.2 搬动文件中的数据

使用者可用sed中的hold space暂存编辑中的数据、用函数参数w(参照[section4.9])将文件数据搬动到其它文件内储存、或用函数参数r(参照[section4.8])将其它文件内容搬到文件内。Hold space是sed用来暂存pattern space内数据的缓存器,当sed执行函数参数h、H(参照[section4.19])时,会将pattern space数据暂存到hold space;当执行函数参数x、g、G(参照[section4.22])时,会将暂存的数据取到pattern space。下面举三个例子说明。

例一、将文件中的前100行数据,搬到文件中第300行后输出。其命令行如下:

sed -f mov.scr 文件

mov.scr文件的内容为

1,100{

H

d

}

300G

其中,

1,100{

H

d

}

它表示将文件中的前100行数据,先储存(参照[section4.19])在hold space之后删除;指令300G(参照[section4.22])表示,将hold space内的数据,添加在文件中的第300行数据后输出。

例二、将文件中含"phi"字符串的数据行,搬至mach.inf文件中储存。其命令行如下:

sed -e ‘/phi/w mach.inf’ 文件

例三、将mach.inf文件内容,搬至文件中含"beta"字符串的数据行之下。其命令行如下:

sed -e ‘/beta/r mach.inf’ 文件

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

3.3 删除文件中的数据

因为sed是行编辑器,所以sed很容易删除个别数据行或整个数据区。一般用函数参数d(参照[section4.2])或D(参照[section4.17])来表示。下面举两个例子说明。

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

sed -e ‘/^$/d’ 文件

regular expression(注释[附录A])中,^$表示空白行。其中,^限制其后字符串必须在行首;$限制其前字符串必须在行尾。

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

sed -e ‘/^$/{

N

/^\n$/D

}’ 文件

其中,函数参数N(参照[section4.16])表示,将空白行的下一行数据添加至pattern space内。函数参数/^\n$/D表示,当添加的是空白行时,删除第一行空白行,而且剩下的空白行则再重新执行指令一次。指令重新执行一次,删除一行空白行,如此反复直至空白行后添加的为非空白行为止,故连续的空白行最后只剩一空白行被输出。

3.4 搜寻文件中的数据

Sed可以执行类似Unix命令grep的功能。理论上,可用regular expression(参照[附录A])。例如,将文件中含有"gamma"字符串的数据行输出。则其命令行如下:

sed -n -e ‘/gamma/p’ 文件

但是,sed是行编辑器,它的搜寻基本上是以一行为单位。因此,当一些字符串因换行而被拆成两部份时,一般的方法即不可行。此时,就必须以合并两行的方式来搜寻这些数据。其情况如下面例子:

将文件中含"omega"字符串的数据输出。其命令行如下

sed -f gp.scr 文件

gp.scr文件的内容如下:

/omega/b

N

h

s/.*\n//

/omega/b

g

D

在上述sedscript(注释[10]),因借着函数参数b形成类似C语言中的case statement结构,使得sed可分别处理当数据内含"omega"字符串;当"omega"字符串被拆成两行;以及数据内没有"omega"字符串的情况。接下来就依上述的三种情况,将sed script分成下面三部份来讨论。

当数据内含"omega",则执行编辑指令

/omega/b

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

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

N

h

s/.*\n//

/omega/b

其中,函数参数N(参照[section4.16]),它表示将下一行数据读入使得pattern space内含前后两行数据。函数参数h(参照[section4.19]),它表示将pattern space内的前后两行数据存入hold space。函数参数s/.*\n//,它表示将pattern space内的前后两行数据合并(注释[11])成一行。/omega/b,它表示如果合并后的数据内含"omega"字符串,则不用再执行它之后的指令,而将此数据自动输出:

当合并后的数据依旧不含"omega",则执行编辑指令如下

g

D

其中,函数参数g(参照[section4.21]),它表示将hold space内合并前的两行数据放回pattern space。函数参数D(参照[section4.17]),它表示删除两行数据中的第一行数据,并让剩下的那行数据,重新执行sed script。如此,无论的数据行内或行间的字符串才可搜寻完全。

第四章、介绍函数参数

本章将以一节一个函数参数的方式,介绍所有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.1 s

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

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

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

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

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

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

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

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

sed -e ‘s/test/& my car/’ 数据文件名

指令中,&代表pattern字符串"test"。故执行后,数据文件的"test"被替换成"test my car"。

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

sed -e ‘s/\(test\) \(my\) \(car\)/[\2 \3 \1]/’ 数据文件名

指令中,\1表示"test"、\2表示"my"、\1表示"car"字符串。故执行后,数据文件的"test my car"被替换成"[my car test]"。

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

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

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

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

当flag为p时,代表替换第一个符合pattern的字符串后,将数据输出标准输出文件。

当flag为w wfile时,代表替换第一个符合pattern的字符串后,输出到wfile文件内(如果wfile不存在,则会重新打开名为wfile的文件)。

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

delimiter:在"/pattern/replace/[flag]"中"/"被当成一delimiter。除了空白(blank)、换行(newline)之外,使用者可用任何字符作为delimiter。例如下述编辑指令

s#/usr#/usr1#g

上述命令中"#"为delimiter。如果用"/"做delimiter,则sed会将pattern与replacement中的"/"当成delimiter而发生错误。

范例:题目:替换input.dat文件(后面如果没有特别指定,均假设文件名为input.dat)内"1996"字符串成"1997",同时将这些数据行存入year97.dat文件内。

说明:用函数参数s指示sed将"1996"字符串替换成"1997",另外用s argument中的flag w指示sed将替换过的数据行存入year97.dat文件内。

sed命令行:

sed -e ‘s/1996/1997/w year97.dat’ input.dat

4.2 d

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

[address1[,address2]]d

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

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

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

将pattern space内符合地址参数的数据删除;将下一笔数据读进pattern space;重新执行sed script。

范例:可参考section3.3。

4.3 a

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

[address1] a\ 使用者所输入的数据

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

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

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

sed执行添加动作情况如下:当pattern space内数据输出后,sed跟着输出使用者所输入的数据。

范例:题目:添加"多任务操作系统"在含"UNIX"字符串的数据行后。假设input.dat文件的内容如下:

UNIX

说明:用函数参数a将所输入的数据添加在含"UNIX"字符串的数据行后。

sed命令行如下:

sed -e ‘/UNIX/a\

多任务操作系统

‘ input.dat

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

UNIX

多任务操作系统

4.4 i

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

[address1] i\ 使用者所输入的数据

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

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

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

sed执行插入动作的情况如下:在pattern space内数据输出前,sed先输出使用者所输入的数据。

范例:题目:将"文章版权属于中央研究院"插在input.dat文件中含"院长:李远哲"的数据行之前。假设input.dat文件内容如下:

院长:李远哲

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

sed命令行如下:

sed -e ‘/院长:李远哲/i\

文章版权属于中央研究院

‘ input.dat

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

文章版权属于中央研究院

院长:李远哲

4.5 c

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

[address1[,address2]]c\ 使用者所输入的数据

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

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

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

sed执行改变动作的情况:在pattern space内数据输出时,sed改变它成为使用者所输入的数据。

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

4.6 p

函数参数p表示打印数据。其指令格式如下:

[address1[,address2]] p

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

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

sed执行打印动作的情况如下:sed拷备一份pattern space内容至标准输出文件。

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

4.7 l

函数参数l,除可将数据中的nonprinting character以ASCII码列出外,其余均与函数参数p相同。例如,将下面input.dat文件中的^[以ASCII码打印

The Great ^[ is a movie starring Steve McQueen.

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

The Great \003 is a movie starring Steve McQueen.

The Great     is a movie starring Steve McQueen.

上述第二行数据为sed的自动输出(请参照注释[])。

4.8 r

函数参数r表示读入它文件内容到文件中。其指令格式如下:

[address1] r 其它文件名称

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

函数参数r最多与一个地址参数配合。

在指令中,函数参数r与其它文件名称间,只能有一空格。

sed执行读入动作的情况如下:在pattern space内数据输出后,sed读出其它文件的内容跟着输出。当其它文件不存在时,sed照样执行其它指令而不会有任何错误讯息产生。

范例:参考section3.1之例三。

4.9 w

函数参数w表示将文件中的写到其它文件内。其指令格式如下:

[address1[,address2]] w 其它文件名称

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

函数参数w最多与两个地址参数配合。

在指令中,函数参数w与其它文件名称间,只能有一空格。

sed执行写出动作的情况如:将pattern space内数据写到其它文件内。数据写入时,会取代(overwrite)原来文件内的数据。另外,当其它文件不存在时,sed会重新产生(creat)它。

范例:参考section3.1之例二。

4.10 y

函数参数y表示转换数据中的字符。其指令格式如下:

[address1[,address2]]y /xyz…/abc…/

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

函数参数最多配合两个地址参数。

指令中,/abc…/xyz…/(x、y、z、a、b、c代表某些字符)为y的argument。其中abc…与xyz…的字符个数必须相同。

sed执行转换时,将pattern space内数据内的a字符转换成x字符、b字符转换成y字符、c字符转换成z字符…。

范例:题目:将input.dat文件中的小写字母改成大写。假设input.dat文件的内容如下:

Sodd’s Second Law:

Sooner or later, the worst possible set of

circumstances is bound to occur.

说明:利用函数参数y指示sed做字母大小的转换。

sed命令行如下:

sed -e ‘

y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/

‘ input.dat

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

SODD’S SECOND LAW:

SOONER OR LATER, THE WORST POSSIBLE SET OF

CIRCUMSTANCES IS BOUND TO OCCUR.

4.11 !

函数参数!表示不执行函数参数。当有如下指令时,

[address1[,address2]] ! 函数参数

表示,对符合地址参数之数据不执行函数参数。例如删除,除了含"1996"字符串,所有数据行,则执行如下命令

sed -e ‘/1996/!d’ input.dat

4.12 n

函数参数n表示读入下一行数据。其指令格式如下:

[address1[,address2]]n

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

函数参数n最多配合两个地址参数。

sed执行读入下一行动作的情况如下:

输出在pattern space的数据。

将下一笔数据读到pattern space。

执行下一个编辑指令。

范例(可与[section4.18]中的范例比较):

题目:输出input.dat文件内偶数行数据。假设input.dat文件内容如下:

The

UNIX

Operation

System

说明:在命令行上以选项-n,将数据输出的控制权(参照[section2.5])转给指令。

利用函数参数n将下一行数据(偶数行)取代pattern space内的数据行(奇数行)。

利用函数参数p将pattern space内的数据(偶数行)输出。

最后,整个输出只有原先文件内的偶数行数据。

sed命令行如下:

sed -n -e ‘n’ -e ‘p’ infro.dat

执行上述命令后,输出的结果如下:

UNIX

System

4.13 q

函数参数q表示跳离sed。其指令格式如下:

[address1] q

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

函数参数q最多配合一个地址参数。

sed执行跳离动作时,它停止输入pattern space数据,同时停止数据送到标准输出文件。

范例:题目:对文件文件执行script_file内的编辑指令,除非遇到"Linux"字符串。

说明:无论script_file内是何种指令,使用者只要在命令行上用指令/Linux/q,函数参数q会强迫sed遇到"Linux"时做跳离动作。

sed命令行如下:

sed -e ‘/Linux/q’ -f script_file input.dat

4.14 =

函数参数=表示打印数据的行数。其指令格式如下:

[address1,[address2]] =

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

函数参数=最多配合两个地址参数。

执行时,行数将在数据输出前先输出。

范例:题目:打印input.dat文件内数据行数。假设input.dat的内容如下:

The UNIX

Operating System

说明:用函数参数=来打印数据的行数。

sed命令行如下:

sed -e ‘=’ input.dat

执行上述命令后,输出的结果如下:

1

The UNIX

2

Operating System

4.15 #

在script file内,函数参数#后的文字为注解。当注解文字超过多行时,其行间须以"\"换行字符相隔。

4.16 N

函数参数N表示添加下一笔数据在pattern space内。其指令格式如下:

[address1,[address2]] N

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

函数参数N最多配合两个地址参数。

sed执行时,将下一行数据读入并添加在pattern space内,数据行间以换行字符(embedded newline character)分隔。此外,在替换时,换行字符可用\n来match。

范例:题目:将下述两行数据合并。假设input.dat的内容如下:

The UNIX

Operating System

说明:先利用函数参数N将两行数据置于pattern space内,在利用函数参数s/\n//将两行数据间的分隔号\n以空白替代,如此两行数据变成一行输出。

sed命令行如下:

sed -e ‘N’ -e ‘s/\n/ /’ input.dat

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

The UNIX Operating System

4.17 D

函数参数D表示删除pattern space内的第一行数据。其指令格式如下:

[address1,address2]D

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

函数参数D最多配合两个地址参数。

函数参数D与d的比较如下:

当pattern space内只有一数据行时,D与d作用相同。

当pattern space内有多行数据行时

D表示只删除pattern space内第一行数据;d则全删除。

D表示执行删除后,pattern space内不添加下一笔数据,而将剩下的数据重新执行sed script;d则读入下一行后执行sed script。

范例:参考section3.3的第二个例子。

4.18 P

函数参数P表示打印patternspace内的第一行数据。其指令格式如下:

[address1,address2] P

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

函数参数P最多配合两个地址参数。

P与p,除了面对的pattern space内的数据行数不同外,其它均相同。

范例(可与[section4.12]中的范例):题目:输出input.dat文件内奇数行数据。假设input.dat文件内容如下:

The

UNIX

System

说明:在命令行上

以选项-n,将数据输出的控制权(参照[section2.5])转给指令。

利用函数参数N将偶数行添加至pattern space内奇数行后。

利用函数参数P将pattern space内的第一行(奇数行)输出。

在奇数行输出后,pattern space内剩下的数据行(偶数行)则被放弃输出。最后,整个输出只有原先的奇数行数据。

sed命令行:

sed -n -e ‘N’ -e ‘P’ infro.dat

执行上述命令后,输出的结果如下:

The

System

4.19 h

函数参数h表示暂存pattern space的数据至hold space。其指令格式如下:

[address1,[address2]] h

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

函数参数h最多配合两个地址参数。

sed执行暂存动作时,会盖掉(overwrite) hold space内原来的数据。

当sed全部执行结束时,hold space内数据会自动清除。

范例:参考section3.4的例子。

4.20 H

函数参数H与h唯一差别是,sed执行h时,数据盖掉(overwrite)hold space内原来的数据,而H,数据则是"添加(append)"在hold space原来数据后。例题请参考section3.2之例一。

4.21 g

函数参数g表示与函数参数h相反的动作,它表示将hold space内数据放回pattern space内。其指令格式如下:

[address1,address2]g

函数参数g最多配合两个地址参数。

sed执行放回动作时,数据盖掉(overwrite)(注释[13])pattern space内原来的数据。

例题:参考section3.4的例子。

4.22 G

函数参数G与g唯一差别是,sed执行g时,数据盖掉(overwrite)pattern space内原来的数据,而G,数据则是"添加(append)"在pattern space原来数据后。例子请参考section3.2例一。

4.23 x

函数参数x表示交换hold space与pattern space内的数据。其指令格式如下:

[address1,[address2]] x

函数参数x大部份与其它处理hold space的函数参数一起配合。例如,将input.dat文件内第1行数据取代第3行数据。此时,用函数参数h与x来配合。其中,以函数参数h将第1数据存入hold space;当第3行数据出现在pattern space,以函数参数x交换hold space与pattern space的内容。如此,第3行数据就被第1数据替代。其命令行如下:

sed -e ‘1h’ -e ‘3x’ input.dat

4.24 b、:label

函数参数:与函数参数b可在sed script内建立类似BASIC语言中GOTO指令的功能。其中,函数参数:

建立标记:函数参数b将下一个执行的指令branch到标记处执行。函数参数:与b,在script file内配合的情况如下

.

.

.

编辑指令m1

:记号

编辑指令m2

.

.

.

[address1,[address2]]b [记号]

其中,当sed执行至指令[address1,[address2]]b [记号]时,如pattern space内的数据符合地址参数,则sed将下一个执行的位置branch至由:记号(注释[14])设定的标记处,也就是再由"编辑指令m2"…执行。另外,如果指令中函数参数b后没有记号,则sed将下一个执行的指令branch到script file的最后,利用此可使sed script内有类似C语言中的case statement结构。

范例:题目:将input.dat文件内数据行的开头字母重复印40次。假设input.dat文件的内容如下:

A

B

C

说明:用指令b p1与:p1构成执行增加字母的循环(loop),同时在字母出现40个时,也用指令b来跳出循环。下面就以文件内第一行数据"A"为例,描述它如何连续多添加39个"A"在同一行:

用指令s/A/AA/(参照section4.1)将"A"替换成"AA"。

用指令b p1与:p1构成循环(loop),它目的使上述动作被反复的执行。每执行一次循环,则数据行上的"A"就多出一个。例如,第一次循环数据行变成"AA",第二次循环数据行变成"AAA"…。

用指令[ABC]\{40\}/b(注释[15])来作为停止循环的条件。当数据行有连续40个A出现时,函数参数b将执行的指令跳到最后,停止对此行的编辑。

同样,对其他数据行也如同上述的方式执行。

sed命令行如下:

sed -e ‘{

:p1

/A/s/A/AA/

/B/s/B/BB/

/C/s/C/CC/

/[ABC]\{40\}/b

b p1

}’ input.dat

4.25 t

基本上,函数参数t与函数参数b的功能类似,除了在执行t的branch前,会先去测试其前的替换指令有没有执行替换成功外。在script file内的情况如下:

.

.

.

编辑指令m1

:记号

编辑指令m2

.

.

.

s/…/…/

[address1,[address2]]t [记号]

编辑指令m3

其中,与函数参数b不同处在于,执行函数参数t branch时,会先检查其前一个替换指令成功与否。如成功,则执行branch;不成功,则不branch,而继续执行下一个编辑指令,例如上面的编辑指令m3。

范例:题目:将input.dat文件中数据A1替换成C1、C1替换成B1、B1替换成A1。input.dat文件的内容如下:

代号

B1

A1

B1

C1

A1

C1

说明:input.dat文件中全部数据行只需要执行一次替换动作,但为避免数据被替换多次,所以利用函数参数t在sed script内形成一类似C语言中case statement结构,使每行数据替换一次后能立即用函数参数t跳离替换编辑。

sed命令行:

sed -e ‘{

s/A1/C1/

t

s/C1/B1/

t

s/B1/A1/

t

}’ input.dat

附录A:常用的regular expression

普通字符 由普通字符所组成的regular expression,其意义与原字符串字面意义相同。

^字符串 限制字符串必须出现于行首 。

$字符串 限制字符串必须出现行尾。

. 表示任意一字符。

[…] 字符集合,用以表示两中括号间所有字符当中的任一个,如[^…]表示两中括号间所有字符以外的字符。

-& 字符集合中可用"&"指定字符的范围。

* 用以形容其前的字符(或字符集合)可重复任意多次。

\n 表示嵌入新行字符(embedded new line character)。

\(…\) 在regular expression中使用"\(""\)"来括住一部份的regular expression:

其后可用"\1"来表示第一个被"\(""\)"括住的部份。若regular expression中使用数次的"\("和"\)"来括住不同的部份,则依次使用"\1","\2","\3",…(最多可到"\9")。

另外,在不同平台上,regular expression会有一些不同的限制,详细情况参照appendix B。

HP-UX Release 9.01与SunOS 5.4内sed对regular expression中各种特殊字符的接受能力

regular expression的特殊字符    HP-UX Release 9.01       SunOS 5.4

.                               接受                     接受

*                               接受                     接受

^                               接受                     接受

$                               接受                     接受

\                               接受                     接受

[ ]                             接受                     接受

\( \)与\1 … \9合用            接受                     接受

\{重复次数\}                    接受                     接受

\{下限,上限\}                   接受                     接受

\下限,\}                        接受                     接受

\                               不接受                   接受

+                               不接受                   不接受

?                               不接受                   不接受

|                               不接受                   不接受

( )                             不接受                   不接受

&                               接受                     接受

注释

注释[1]:

就是后面将会提到的sed script。

注释[2]:

指令s/Unix/UNIX/表示将"Unix"替换成"UNIX"。请参照section4.1。

注释[3]:

在指令中有20几个函数参数可供选择。

注释[4]:

以后这文件称作script file。

注释[5]:

编辑指令1,10d中,地址参数为1,10,故1至10行的数据执行函数参数d所指定的删除动作。

注释[6]:

编辑指令s/yellow/black/g中,由于没有地址参数,故所有的数据行都要执行函数参数s/yellow/black/g所指定替换动作。在函数参数s/yellow/black/g中,/yellow/black/g为s的argument,其表示替换数据行中所有的"yellow"成"black"。

注释[7]:

其命令格式如下:

sed -n [-e 编辑指令].. [-f script_file].. [文件..]

注释[8]:

这些编辑指令中的函数参数可能是p、l、s的其中之一。

注释[9]:

在有些情况下,也可用编辑指令代替函数参数。例如section3.3之例二。

注释[10]:

这里,sed script是指gp.scr文件的内容。它表示这一次sed执行的编辑指令。

注释[11]:

此函数参数,表示替换掉(除掉)pattern space内两行间的换行记号。故pattern space内只有一行数据。

注释[12]:

/pattern/replacement/[flag]为函数参数s的argument。

注释[13]:

注意此时,虽然数据是放回pattern space,但hold space的内容还是不变。

注释[14]:

注意":"与记号间不可有空格。

注释[15]:

地址参数[ABC]\{40\},表示40个A字母或40个B字母或40个C字母。其中[ABC]表示"A"或"B"或"C";其后的\{40\}表示其前的字母有40个。regular expression请参照附录A。

本文来自:Linux文库 — http://doc.linuxpk.com/472.html

文章出自:CCIE那点事 http://www.jdccie.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。
本文标题:SED手册
本文链接:http://www.jdccie.com/?p=3170转载请注明转自CCIE那点事
如果喜欢:点此订阅本站
上篇文章:
  • 相关文章
  • 为您推荐
  • 各种观点

暂时还木有人评论,坐等沙发!
发表评论

您必须 [ 登录 ] 才能发表留言!