《Unix Shell 实例精解》学习笔记之sed篇

作者: csbde 分类: Linux 发布时间: 2008-03-21 17:35

打印:p命令 sed '/north/p' datafile 默认输出所有行,找到north的行重复打印 sed –n '/north/p' datafile 禁止默认输出,只打印找到north的行 2> 删除:d命令 sed '3d' datafile 删除第三行,其余行输出到屏幕 sed '3,$d' datafile 从第3行到最后一行都删除,将剩余部分输出到屏幕 sed '/north/d' datafile 将含有north的行删除,其余输出到屏幕 3> 替换:s命令 sed 's/west/north/g' datafile 解释:找到datafile中的所有west并替换成north,将替换后的内容输出到屏幕。 sed 's/[0-9][0-9]$/&amp;.5/' datafile 解释:在替代串里的&amp;字符代表在搜索串中真正找到的。每个以两个数字结尾的行都被它自己取代,且要在后面加上.5 sed -n 's/Hemenway/Jones/gp' datafile 解释:所有的Hemenway所在的位置都用Jones来取代,而且只有改变的行被打印。-n与p命令选项相结合来禁止默认输出。g代表全局替换 sed -n 's/(Mar)got/1ianne/p' datafile 解释:模式Mar被封装在括弧里且在一个专用寄存器里存为标记1。在替换串里它将被引用做1。然后用Marianne替代Margot。 sed 's#3#88#g' datafile 解释:s命令后面的字符是搜索串和替换串之间的分界符。默认的分界符是一个正斜杠,但也可以改变(只有使用s命令时)。无论s命令后面跟什么字符,它都是新的串分界符。当搜索包含一个正斜杠的模式,如路径或生日时,这种技巧可能有用的 ^V^ 4> 被选中的行的范围:逗号 sed -n '/west/,/east/p' datafile 解释:打印在west和east之间的模式范围内所有行。如果west出现在east之后,则打印从west到下一个east或者到文件末尾的行,无论哪种情况先出现都可以。 sed '/west/,/east/s/$/**VACA**/' datafile 解释:对于在模式west到east范围内的行,行末尾将用**VACA**来取代。 5> 多次编辑 -e 选项 sed -e '1,3d' -e 's/Hemenway/Jones/' datafile -e选项允许多次编辑。不同的编辑顺序可能导致不同的结果。 例如,如果两个命令都执行了替换,第一次替换可能影响第二次替换。 6> 从文件中读取:r命令 sed '/Suan/r newfile' datafile 解释:r命令从newfile中读取内容,将内容输出到Suan的后面。如果datafile中Suan出现的次数不只一次,则分别放到Suan的后面。 7> 写入文件:w命令 sed -n '/north/w newfile' datafile 解释:w命令把指定的行写入到一个文件。本例中所有的包含north的行写入到newfile中。 等同于 sed -n '/north/p' datafile > newfile 8> 添加:a命令 $ sed '/north/a > ---->THE NORTH SALES DISTRICT HAS MOVED<-----' datafile northwest NW Charles Main 3.0 .98 3 34 ---->THE NORTH SALES DISTRICT HAS MOVED<----- western WE Sharon Gray 5.3 .97 5 23 southwest SW Lewis Dalsass 2.7 .8 2 18 southern SO Suan Chin 5.1 .95 4 15 southeast SE Patricia Hemenway 4.0 .7 4 17 eastern EA TB Savage 4.4 .84 5 20 northeast NE AM Main Jr. 5.1 .94 3 13 ---->THE NORTH SALES DISTRICT HAS MOVED<----- north NO Margot Weber 4.5 .89 5 9 ---->THE NORTH SALES DISTRICT HAS MOVED<----- central CT Ann Stephens 5.7 .94 5 13 解释:红颜色的内容是要输入的内容。a命令后面跟要添加的内容。奇怪的是a后面必须另起一行,在输入要添加的内容,否则会提示命令错乱,真是搞不懂。 9> 插入:i命令 $ sed '/north/i > ---->THE NORTH SALES DISTRICT HAS MOVED<-----' datafile ---->THE NORTH SALES DISTRICT HAS MOVED<----- northwest NW Charles Main 3.0 .98 3 34 ---->THE NORTH SALES DISTRICT HAS MOVED<----- western WE Sharon Gray 5.3 .97 5 23 southwest SW Lewis Dalsass 2.7 .8 2 18 southern SO Suan Chin 5.1 .95 4 15 southeast SE Patricia Hemenway 4.0 .7 4 17 eastern EA TB Savage 4.4 .84 5 20 ---->THE NORTH SALES DISTRICT HAS MOVED<----- northeast NE AM Main Jr. 5.1 .94 3 13 ---->THE NORTH SALES DISTRICT HAS MOVED<----- north NO Margot Weber 4.5 .89 5 9 central CT Ann Stephens 5.7 .94 5 13 10>下一个:n命令 $ sed '/eastern/{n;s/AM/Archie/;}' datafile northwest NW Charles Main 3.0 .98 3 34 western WE Sharon Gray 5.3 .97 5 23 southwest SW Lewis Dalsass 2.7 .8 2 18 southern SO Suan Chin 5.1 .95 4 15 southeast SE Patricia Hemenway 4.0 .7 4 17 eastern EA TB Savage 4.4 .84 5 20 northeast NE AM Main Jr. 5.1 .94 3 13 ...... 解释:如果在某一行里模式eastern被匹配,n命令使sed区的下一行,用该行带换模式空间,用Archie替换AM,打印并继续。 11>变换:y 命令 % sed '1,3y/abcdefghijklmnopqrst/ABCDEFGHIJKLMNOPQRST/' datafile 解释:将对应字母进行转换。 12>退出:q命令 % sed '5q' datafile 解释:在打印了5行之后,用q命令退出sed程序。 13>保存和取得:h和G命令 $ sed -e '/southeast/h' -e '$G' datafile northwest NW Charles Main 3.0 .98 3 34 western WE Sharon Gray 5.3 .97 5 23 southwest SW Lewis Dalsass 2.7 .8 2 18 southern SO Suan Chin 5.1 .95 4 15 southeast SE Patricia Hemenway 4.0 .7 4 17 eastern EA TB Savage 4.4 .84 5 20 northeast NE AM Main Jr. 5.1 .94 3 13 north NO Margot Weber 4.5 .89 5 9 central CT Ann Stephens 5.7 .94 5 13 southeast SE Patricia Hemenway 4.0 .7 4 17 解释:当sed处理文件时,每行都存在模式空间(pattern space)的临时缓存中。除非行被禁止打印或删除,否则行将在处理完后被打印到屏幕,然后请模式空间并把下一输入行保存在那里等待处理。在这个例子中,在找到模式之后,把它放在模式空间里,而且h命令复制它并把它存到另一个叫做保存缓存(holding buffer)中。 第二个sed指令里,当读入最后一行($)时,G命令告诉sed从包存缓存中取得该行并放回模式空间缓存,添加到当前存在那里的行中。本例子就是最后一行。 $ sed -e '/WE/{h;d;}' -e '/CT/G' datafile northwest NW Charles Main 3.0 .98 3 34 southwest SW Lewis Dalsass 2.7 .8 2 18 southern SO Suan Chin 5.1 .95 4 15 southeast SE Patricia Hemenway 4.0 .7 4 17 eastern EA TB Savage 4.4 .84 5 20 northeast NE AM Main Jr. 5.1 .94 3 13 north NO Margot Weber 4.5 .89 5 9 central CT Ann Stephens 5.7 .94 5 13 western WE Sharon Gray 5.3 .97 5 23 解释:第一个命令h将找到了WE的行放到保存缓存中,然后删除该行;第二个命令/CT/G就是在找到了CT的行的后面加入保存缓存的内容。 14>G和g的区别 G命令在符合的条件行后面添加保存缓存中的内容;g命令用保存缓存中的内容覆盖符合条件的行。 15>sed 命令的花括号{}的作用 花括号{}中可以放入多个命令,每个命令后面要用分号;。 16>保存和交换:h 和 x命令。 $ sed -e '/Patricia/h' -e '/Margot/x' datafile northwest NW Charles Main 3.0 .98 3 34 western WE Sharon Gray 5.3 .97 5 23 southwest SW Lewis Dalsass 2.7 .8 2 18 southern SO Suan Chin 5.1 .95 4 15 southeast SE Patricia Hemenway 4.0 .7 4 17 eastern EA TB Savage 4.4 .84 5 20 northeast NE AM Main Jr. 5.1 .94 3 13 southeast SE Patricia Hemenway 4.0 .7 4 17 central CT Ann Stephens 5.7 .94 5 13 解释:x命令将找到的行用保存缓存中的内容替换。 7. 用sed来编写命令表 sed 命令表(script)是文件里的一个sed命令列表。用-f选项来引用一个命令表文件。编辑sed命令表有特殊要求:命令末尾不能有任何为岁的空白符或者文本。如果命令不是自成一行,就必须用分号结束。在源代码chap4目录下有两个编辑好的命令表文件(sedding1和sedding2)可以参考。 下面是使用sed命令表的例子。 $ sed -f sedding1 datafile EMPLOYEE DATABASE --------------------- northwest NW Charles Main 3.0 .98 3 34 western WE Sharon Gray 5.3 .97 5 23 southwest SW Lewis Dalsass 2.7 .8 2 18 Lewis is the TOP Salesperson for April!! Lewis is moving to the southern district next month. CONGRATULATIONS! southern SO Suan Chin 5.1 .95 4 15 southeast SE Patricia Hemenway 4.0 .7 4 17 eastern EA TB Savage 4.4 .84 5 20 northeast NE AM Main Jr. 5.1 .94 3 13 ******************* MARGOT HAS RETIRED ******************* 8. Sed练习参考答案 练习内容参考databook文件 1〉 把Jon改成Jonathan sed 's/Jon/Jonathan/' datebook 2〉 删除头3行 sed '1,3d' datebook 3〉 打印5—10行 sed -n '5,10p' datebook 4〉 删除包含Lane的行 sed '/Lane/d' datebook 5〉 打印所有生日是在Noverber到December之间的行 sed -n '/:1[12]//p' datebook 6〉 把三个星添加到以Fred开头的行尾 sed '/^Fred/s/$/***/' datebook 7〉 用JOSE HAS RETIRED取代包含Jose的行 sed 's/^Jose[0-9]*[a-z]*[A-Z]* *.*$/JOSE HAS LEFT/' datebook 8〉 把Popeye的生日改成11/14/46 sed '/Popeye/s/:[0-9]*[0-9]*/[0-9]*[0-9]*/[0-9]*[0-9]*/:11/14/46/' datebook 9〉 删除所有空白行 sed '/^$/d' datebook 10〉 写一个sed命令表,将: a. 在第1行之前插入标题PERSONNEL FILE b. 删除以500结尾的工资 c. 打印文件内容,把姓和名颠倒 d. 在文件末尾添加THE END 答案放在chap04/a10文件中,内容如下: # My first sed script by Wangzhh. 1i PERSONNEL FILE /500/d s/([A-Z][a-z]*) ([A-Z][a-z]*):/2 1:/ $a THE END]]>

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

电子邮件地址不会被公开。 必填项已用*标注