Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191237
  • 博文数量: 49
  • 博客积分: 1959
  • 博客等级: 上尉
  • 技术积分: 492
  • 用 户 组: 普通用户
  • 注册时间: 2008-12-08 16:23
文章分类

全部博文(49)

文章存档

2012年(8)

2011年(34)

2008年(7)

分类:

2011-04-25 22:20:35

如果没有指定-e、--expression、-f或--file选项,sed就将第一个非选项的命令行变量作为将要解析执行的sed脚本,其余的命令行变量被视为输入文件名。如果没有指定输入文件,sed将从标准输入读取输入。
命令p是打印命令,用于显示模式缓冲区的内容。默认情况下,sed把输入行打印在屏幕上,选项-n用于取消默认的打印操作。当选项-n和命令p同时出现时,sed可打印选定的内容。
命令d用于删除输入行,sed先将输入行从文件复制到模式缓冲区,然后对该行执行sed命令,最后将模式缓冲区的内容显示在屏幕上。如果发出的是命令d,当前模式缓冲区里的输入行会被删除不被显示。
命令s是替换命令。替换和取代文件中的文本可以通过sed中的s命令来实现,s后包含在斜杠中的文本是正则表达式,后面跟着的是需要替换成的文本。可以通过g标志对行进行全局替换。
当“与”符号(&)用在替换串中时,它代表在查找串中匹配到的内容。比如:sed 's/[0-9][0-9]$/&.5/' datafile,此例中,所有以两位数结尾的行后面都被加上.5。
紧跟在s命令后的字符就是查找串和替换串之间的分隔符。分隔符默认为正斜杠,但可以改变。无论什么字符(换行符、反斜线除外),只要紧跟着s命令,就成了新的串分隔符,比如:sed 's#3#88#g' datafile。这个方法在查找包含正斜杠的模式时很管用,例如查找路径名或生日。
行的范围从文件中的一个地址开始,在另一个地址结束。地址范围可以是行号(例如:5,10)、正则表达式(例如:/Dick/和/Joe/),或者两者的结合(例如:/north/,$)。范围是闭合的——包含开始条件的行,结束条件的行,以及两者之间的行。如果结束条件无法满足,就会一直操作到文件结尾。如果结束条件满足,则继续查找满足开始条件的位置,范围重新开始。
-e命令是用于进行多重编辑的名令,用于sed执行多个编辑任务的情况下。在下一行开始编辑前,所有的编辑动作将应用到模式缓冲区中的行上。
r命令是读命令。sed使用该命令将一个文本文件中的内容加到当前文件的特定位置上。
w命令是写命令,sed使用该命令将当前文件中的一些行写到另一个文件中。
a命令是追加命令,追加将添加新文本到文件中当前行(即读入模式缓冲区中的行)的后面。不管是在命令行中,还是在sed脚本中,a命令总是在反斜杠的后面。如果在C/TC shell命令行中,则需要两个反斜杠,一个反斜杠用于sed追加命令,另一个用于行的继续。在C/TC shell中,用于sed命令的两个引号必须位于同一行。因此,第二个反斜杠使得在下一行继续键入而不会导致引号不匹配错误(Bourne Shell和Bash shell不需要第二个反斜杠,因为两个引号不需要在同一行上)。所追加的文本行位于sed命令的下方另起一行。如果要追加的内容超过行,则每一行都必须以反斜杠结束,最后一行除外。最后一行将以引号和文件名结束。
[root@centos ~]# sed '/^north/a\
--->THE NORTH SALES DISTRICT HAS MOVED<---' datafile
i命令是插入命令,类似于a命令,但是不是在当前行后增加文本,而是在当前行的前面插入新的文本,即刚读入模式缓冲区中的行。在命令行或者sed脚本中,i命令后都带一个反斜杠。
[root@centos ~]# sed '/eastern/i\
 NEW ENGLAND REGION\
 -------------------------------------' datafile
c命令是修改命令,sed使用该命令将已有文本修改成新的文本,旧文本被覆盖。
[root@centos ~]# sed '/eastern/c\
 THE EASTERN REGION HAS BEEN TEMPORARILY CLOSED' datafile
n命令表示下一条命令。sed使用该命令获取输入文件的下一行并将其读入到模式缓冲区中,任何sed命令都将应用到匹配行紧接着的下一行上。
[root@centos ~]# sed '/eastern/{n;s/AM/Archie/;}' datafile
y命令表示转换。该命令与Unix/Linux中的tr命令相似,字符按照一对一的方式从左到右进行转换。
[root@centos ~]# sed '1,3y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' datafile
q命令表示退出命令。该命令将导致sed程序退出,且不再进行其他的处理。
[root@centos ~]# sed '/Lewis/{s/Lewis/Joseph/;q;}' datafile #在匹配到模式Lewis的行时,s表示先用Joseph替换Lewis,然后q命令让sed程序退出。
h命令表示暂存,g命令表示取用。当从文件中读取一行时,sed将该行放置到模式缓冲区中,并在改行上执行命令。有一个称为暂存缓冲区的附加缓冲区(两个缓冲区都能够存储8192个字节)。h命令将一行从模式缓冲区发送到暂存缓冲区中,随后通过g或G命令获取。
[root@centos ~]# sed -e '/northeast/h' -e '$G' datafile #所有包含模式northeast的行都被复制并追加到文件尾部
[root@centos ~]# sed -e '/WE/{h;d;}' -e '/CT/{G;}' datafile #所有包含模式WE的行都被移出原位置,移到包含模式CT的行的后面。
[root@centos ~]# sed -e '/WE/{h;d;}' -e '/CT/{g;}' datafile #所有包含模式WE的行将移到包含CT的行上并进行覆盖。
[root@centos ~]# sed -e '/northeast/h' -e '$g' datafile #包含模式northeast的行被复制并被用来替换文件的最后一行。
x命令表示互换。sed使用该命令互换暂存缓冲区中的模式与模式缓冲区中的当前行。
[root@centos ~]# sed -e '/Patricia/h' -e '/Margot/x' datafile #包含Margot的行将被包含Patricia的行替换
阅读(1104) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~