sed

#拿掉单一一个 | 竖杠,采用词首和词尾定位符express

sed -e "s|\<\|\>||g"app

 

SED手册
1.Introduction
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能一次执行完将文件中全部空白行删除、替换字串、并将使用者输入的文字添加在文件的第六行等等不一样的编辑动做。
1.2何处得到sed
通常的UNIX系统,自己即附有sed。不一样的UNIX系统所附的sed版本亦不尽相同。若读者所使用的UNIX系统上未附有sed ,则可透过anonymous 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手册- 2.使用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]
其中,位址参数address一、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的函数参数(参照[chapter 4])的功能。
函数参数功能:
label创建script file内指令互相参考的位置。
#创建解
{ }集合有相同位址参数的指令。
!不执行函数参数。
=印出资料行数( line number )。
a添加使用者输入的资料。
b label将执行的指令跳至由:创建的参考位置。
c以使用者输入的资料取代资料。
d删除资料。
D删除pattern space内第一个newline字母前的资料。
g拷贝资料从hold space。
G添加资料从hold space至pattern space。
h拷贝资料从pattern space至hold space。
H添加资料从pattern space至hold space。
l印出l资料中的nonprinting character用ASCII码。
i插入添加使用者输入的资料行。
n读入下一笔资料。
N添加下一笔资料到pattern space。
p印出资料。
P印出pattern space内第一个newline字母前的资料。
q跳出sed编辑。
r读入它档内容。
s替换字串。
t label先执行一替换的编辑指令,若是替换成牛p>则将编辑指令跳至: 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/(请参照[section 4.1] ,进行字串的替换。
2.5.执行输出的控制
在命令列上的选项-n (解[7])表示输出由编辑指令控制。由前章内容得知, sed会"自动的"将资料由pattern space输送到标准输出档。但藉着选项-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.例
通常在实际使用编辑器的过程当中,常须要执行替换文件中的字串、搬移、删除、与搜寻资料行等等动做。
固然,通常交谈式编辑器(如vi、emacs)都能作获得上述功能,但文件一旦有大量上述编辑需求时,则用它们编辑十分没有效率。本章将用举例的方式说明如何用sed自动执行这些编辑功能。此外,在本章例中,均如下述方式描述文件的需求:
将文件中...资料,执行...(动做)
如此,目的是为了能将它们迅速的转成编辑指令。其中, " ...资料"部份,转成指令中的位址参数表示;"执行...动做"部份,则转成函数参数表示。另外,当"执行...动做"要由数个函数参数表示时,则可利用"{ "与" }"集合这些函数参数(解[9]) ,其指令形式以下:
位址参数{
函数参数1
函数参数2
函数参数3
.
:
}

上述指令表示,将对符合位址参数的资料,依次执行函数参数一、函数参数二、函数参数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之後删除;
ui

指令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
/^$/D
}'文件档
其中,函数参数N(参照[section4.16])表示,将空白行的下一行资料添加至pattern space内
spa

函数参数/^$/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/.* //
/omega/b
g
D
在上述sed script(解[10]),因藉着函数参数b造成相似C语言中的case statement结构,使得sed可分别处理当资料内含"omega"字串;当"omega"字串被拆成两行;以及资料内没有"omega"字串的状况。接下来就依上述的三种状况,将sed script分红下面三部份来讨论。
当资料内含"omega" ,则执行编辑指令
/omega/b
它表示当资料内含"omega"字串时, sed不用再对它执行後面的指令,而直接将它输出。
当资料内没有"omega" ,则执行编辑指令以下
N
h
s/.* //
/omega/b
其中,函数参数N(参照[section 4.16]) ,它表示将下一行资料读入使得pattern space内含前後两行资料。函数参数h(参照[section 4.19]) ,它表示将pattern space内的前後两行资料存入hold space。函数参数s/.* // ,它表示将pattern space内的前後两行资料合(解[11])成一行。/omega/b ,它表示若是合後的资料内含"omega"字串,则不用再执行它之後的指令,而将此资料自动输出;当合後的资料依旧不含"omega" ,则执行编辑指令以下
g
D
其中,函数参数g(参照[section4.21]) ,它表示将hold space内合前的两行资料放回pattern space。函数参数D(参照[section4.17]) ,它表示删除两行资料中的第一行资料,并让剩下的那行资料,从新执行sed script。如此,不管的资料行内或行间的字串才可搜寻彻底。
unix

##########################orm

SED手册- 4.介绍函数参数
本章将以一节一个函数参数的方式,介绍全部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"。
:表明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
上述命令中verb|#|为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。
例:可参考section 3.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改变它成为使用者所输入的资料。
例:参考section 3.1之例2、三。
4.6 p
函数参数p表示印出资料。其指令格式以下:
[address1[ , address2]] p
对於上述格式有下面几点说明:
函数参数p最多与两个位址参数配合。
sed执行印出动做的状况以下: sed拷备一份pattern space内容至标准输出档。
例:参考section 3.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
对象

相关文章
相关标签/搜索
本站公众号
   欢迎关注本站公众号,获取更多信息