#sed-n'
05/994712
'A$/*pgrade.txt
Brown-21230
//匹配元字符$前,
28
必须使用反斜线\屏蔽其特殊含义
M.Lulu
06/99
48317
green
9
24
26$20
#sed-n*1p*grade.txt//打印第一行
#sed-n*$p*grade.txt//打印最后一行
要打印整个文件,只需将行范围设为第一行到最后一行1,$。
$意为最后一行。
#sed-n
’1,$pfgrade.txt
M.Tansley
05/99
48311
Green
8
40
44
M.Lulu
06/99
48317
green
9
24
26$20
P.Bunny
02/99
48
Yellow
12
35
28
J.Troll
07/99
4842
Brown-3
12
26
26
L.Tansley
05/99
4712
Brown-2
12
30
28
#sed-n
7.*ing/p*
grade.txt
匹配任意字母,后跟任意字母的0次或多次重复,并以ing结尾,模式为/.*ing八讨以使用这个模式查询以ing结尾的任总单词。
打印行号
要打印行号,使用等号=。
打印模式匹配的行号,使用格式/pattem/=
#sed-e7Troll/=*grade.txt
M.Tansley
05/99
48311
Green
8
40
44
M.Lulu
06/99
48317
green
9
24
26$20
P.Bunny
A
02/99
48
Yellow
12
35
28
4
J.Troll
07/99
4842
Brown-3
12
26
26
L.Tansley
05/99
4712
Brown-2
12
30
28
#sed-n7Troll/=*grade.txt
4
#sed-n-e’/Troll/p’-e7Troll/='grade.txt
J.Troll07/994842Brown-3122626
1.5.1.a:
附加文本
附加文本时不能指定范围,只允许一个地址模式。
文本附加操作时,结果输出在标准输出上。
注意它不能被编辑,因为sed执行时,首先将文件的一行文本拷贝至緩冲区,在这里sed编辑命令执行所有操作(不是在原始文件上),因为文本直接输出到标准输出,seel并无拷贝。
要想在附加操作后编辑文本,必须保存文件,然后运行另一个sed命令编辑它。
这时文件的内容又被移至缓冲区。
附加操作格式如下:
[address]a\
Text\
Text\
text
地址指定一个模式或行号,定位新文本附加位置。
a\通知sed对3\后的文木进行实际附加操作。
观察格式,注意每一行后面有一斜划线,这个斜划线代表换行。
sed执行到这儿,将创建一新行,然后插人卜*—文本行。
最后一行不力n斜•划线,sed假定这是附加命令结尾。
当附加或插入文本或键入几个sed命令时,可以利用辅助的shell提示符以输入多行命令。
$sed*/Atest/a\\>thisisaexample1example
''>thisisaexample〃被追加到以test开头的行后面,sed要求命令a后面有一
个反斜杠。
1.5.2.k插入命令
和附加命令一样,它也只接受一个地址。
#viinsert.sed
#!
/bin/sed-f
/Tansley/i\//也可以使用行号指定文本插入位置,如“1i\”
W.Alice
chmod+xinsert.sed#./insert.sedgrade.txt
W.Alice
M.Tansley
05/99
48311
Green
8
40
44
M.Lulu
06/99
48317
green
9
24
26
P.Bunny
02/99
48
Yellow
12
35
28
J.Troll07/994842Brown-3122626
W.Alice
L.Tansley05/994712Brown-2123028
$sed7test/i\\newline*example
如果test被匹配,则把反斜杠后面的文本插入到匹配行的前面。
1.5.3.c:
修改命令
修改命令将在匹配模式空间的指定行用新文本加以替代,格式如下:
[address]c\
Text\
Text\
text
#vichange,sed
[#!
/bin/sed-f
5c\
!
S.Icy
./change.sedgrade.txt
M.Tansley
05/99
48311
Green
8
40
44
M.Lulu
06/99
48317
green
9
24
26$20
P.Bunny
02/99
48
Yellow
12
35
28
J.Troll
07/99
4842
Brown-3
12
26
26
S.Icy
1.5.4.d:
删除命令
$sed-e’1d’/etc/services|more
使用sed从输出流除去/etc/services文件第一行
$sed-e’1,10cT/etc/services|more
sed将删除输出的第1到10行
$sed-e7A#/d*/etc/services|more
sed删除以开始的行
$sed'$d*example
删除example文件的最后一行
$sed*2,$d'example
删除example文件的第二行到末尾所有行。
$sed7test/*dexample
删除example文件所有包含test的行。
1.5.5.s:
替换文本
替换(substitute)命令用替换模式替换指定模式,格式力
[address[,address]]s/pattern-to-find/replacement-pattern/[gpwn]
s:
通知sed这是一个替换操作,并查询pattern-to-find,成功后用
replacement-pattern待换它。
g:
缺省情况下只替换第一次出现模式,使用g选项替换全局所有出现模式
P:
缺省sed将所有被替换行写入标准输出,加p将使-n选项无效(-n不打印输出结果)
w:
文件名使用此选项将输出定向到一个文件
sed‘s/night/NIGHT/’quote.txt
sed‘sA$//’quote.txt
sed‘/The/Wow!
/g’quote.txt
sed‘s/splend/SPLEND/wsed.out’quote.txt
如果要附加或修改一个字符串,可以使用(&)命令,&命令保存发现模式以便重新调用
它,然后把它放在替换字符串里面。
sed-n‘s/nurse/’’hello”&/p’quote
原句:
ThelocalnurseMissP.Neavewasinattendance.
修改:
Thelocal”hello”nurseMissP.Neavewasinattendance.
#sed-n's/tony/&x/p*employees
500tonyx2000
#sed-n*s/tony/x&/p*employees
500xtony2000
$sed’s/test/mytest/g’example
在整行范围内把test替换为mytest。
如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
$sed-n,s/Atest/mytest/p,example
如果某一行开头的test被替换成mytest,就打印它。
$sed*s/A192.168.0.1/&localhost/*example
&符号表示替换字符串中被找到的部份。
所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.llocalhost。
$sed-nfsA(love\)ableA1rs/p*example
love被标记力1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
$sed’s#10#100#g’example
不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,在这里是分隔符,代替了默认的“/”分隔符。
表示把所有10替换成100。
$sed7test/,/check/s/$/sedtest/*example
对于模板test和west之间的行,每行的末尾用字符串sedtest替换。
1.5.6.r:
从文件读入命令
$sed7test/rfile'example
file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的卜面。
1.5.7.w:
写入文件命令
将sed结果写入文件:
$sed-n’/test/wfile’example
在example屮所有包含test的行都被写入file里。
sed’1,2wtmp*grade.txt
sed’/Alice/wtmp’grade.txt
1.5.8.n:
下一个命令
$sed7test/{n;s/aa/bb/;}*example
如果test被匹配,则移动到匹配行的下一行,锊换这一行的aa,变为bb,并打印该行,然后继续。
1.5.9.y:
变形命令
$sed*1,1Oy/abcde/ABCDEfexample
把1--10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令。
前后两个模式的字长要相同。
1.5.10.q:
退出命令
$sed*10q*example
打印完第10行后,退出sed。
1.5.11.h命令和G命令:
保持和获取
$sed-e’/test/h’-e’$G’example
在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区屮,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。
接着模式空间被清空,并存入新的一行等待处理。
在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。
第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在己经存在于模式空间中的行的末尾。
在这个例子屮就是追加到最后一行。
简单来说,任何包含test的行都被复制并追加到该文件的末尾。
#sed-e*/jason/h'-e'$G'employees
100jason1996
200john1997
300sanjay1998
400ashok.1999
500tony2000
100jason1996
#sed-e*/jason/h*-e'/ashok/G'employees
100jason1996
200john1997
300sanjay1998
400ashok1999
100jason1996
500tony2000
1.5.12.h命令和x命令:
保持和互换
$sed-e1/test/h1-e1/check/x1example
互换模式空间和保持缓冲区的内容。
也就是用包含test的行替换包含check的行。
#catemployees
100jason1996
200john1997
300sanjay1998400ashok1999
500tony2000
#sed-e1/jason/h1-e1/tony/x1employees
100
jason
1996
200
john
1997
300
sanjay
1998
400
ashok
1999
100
jason
1996
1.6.sed选项
-n
缺省sed将所有结果写入标准输出,力卩-n不打印输出结果。
加编辑命令p将使-n选项无效,表示只打印那些发生编辑的行。
-e
下一命令是编辑命令。
使用多项编辑时加入此选项。
如果只用到一条sed命令,此选项无
用,但指定它也没有关系。
-f
如果正在调用sed脚本文件,使用此选项。
此选项通知sed—个脚本文件支持所有的sed
命令,例如:
sed一fmyscript.sedinput_file,这里myscript•sed即为支持
sed命令的文件。
-i
表不inplaceedit,就地修改文件
1.6.1.多点编辑:
e命令
当编辑指令在命令列上执行时,其前必须加上选项-e。
其命令格式如下:
sed-e•编辑指令1*-e•编辑指令2,...文件档
其中,所有编辑指令都紧接在选项-e之後,并置於两个”|”特殊字元间。
另外,命令上编辑指令的执行是由左而右。
一般编辑指令不多时,使用者通常直接在命令上执行它们。
例如,删除yel.dat内1至10行资料,并将其馀文字屮的”yellow”字串改成”black”字串。
此时,可将编辑指令直接在命令上执行,其命令如下:
sed-e’1,10d'-e’s/yellow/black/g*yel.dat
在命令中,编辑指令11,10d1执行删除1至10行资料;编辑指令*s/yellow/black/g*,"yellow"字串替换成"black"字串。
$sed-e*1,5d'-e^/test/check/'example
(-e)选项允许在同一行里执行多条命令。
如例子所示,第一条命令删除1至5行,第二条命令用check替换test。
命令的执行顺序对结果有影响。
如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
$sed-expressions^/test/check/*-expression=7love/dfexample
—个比-e更好的命令是--expression。
它能给sed表达式赋值。
1.6.2.直接修改源文件i
sed可以实现内容的编辑后然后保存到一个文件,然后再覆盖原文件的办法。
sed1s/properties/property/g1build.xml>build.xml.tmp
这样,build,xml.tmp文件就是修改后的文件。
如果无误,那么就可以覆盖原文件mvbuild.xml.tmpbuild.xml
如果想直接修改源文件,而不要这样繁琐的过程,可以用下面的命令
sed-i1s/properties/property/g1build.xml
1.7.在sed中使用变量
有吋,我们耑要awk命令中的模式根据脚本上下文的变化而做相应的变化,这吋就S要用一个变最表示。
可以用单引号包含双引号来引用一个变量。
如果我们用一变量var,它的值根据上下文变化
var=”comm”
sed-n7”’$var”7p’/tmp/test.log
Sed-i’3s/eMME/”’$process”’/’start.sh
1.8.sed脚本
#cat_append,sed
#!
/bin/sed-f//sed命令解释行。
脚本在这一行查找sed以运行命令,这里定位在/bin。
|j/Bunny/a\//a\通知sed这是一个附加操作,首先应插入一个新行。
[
'Jack//附加操作要加入到拷W的实际文本)
#chmod+xappend.sed
#./append.sedgrade.tx