首页 > 代码库 > sed命令分析

sed命令分析

一、简介
	一般来讲,我们用vim处理单个文本,然而有时候我们会需要同时或一次性的修改多个文本,这时sed命令是个非常不错的替代品,其功能非常强大,对我而言,用起来丝毫不必vim逊色。
	sed是所谓的流编辑器,而且是非交互、批处理式的(好吧,这些概念很虚,我其实也不在乎),总的来说,它就是把文本以行为单位进行处理,然后把结果输出到屏幕上(称为标准输出)。
	需要注意的是,如果没有特定参数,sed仅仅在屏幕上显示处理结果而并不改变原文件,或者说,sed把处理结果输出到屏幕而非原文件。想要改变原文件的话,请看下面的办法。

二、格式
	sed  命令  文件列表
	也就是说,sed后面一般是要跟两个参数的,参数之间要用空格隔开。当只有一个参数的时候,这个参数会被默认为命令,而文件列表就会被当成标准输入,然后sed将处理你从键盘输入到命令行上的文本。
	这里要说一下命令的格式,传给sed的命令可以提前写在一个文件里,暂时称之为program,然后使用-f选项指定该文件,如下:
	sed -f program file-list
	这在对文件有多个操作时很有帮助,简化了代码同时提高了代码的重用性,因为改天想要同一批操作对另一些文件修改时,直接使用-f调出program即可,program永久保存了所要进行的操作。program的具体写法在后面。
	另一种命令的格式与上一种算是相对的,因为这种格式中命令的执行是一次性的,并没有保存这些执行过的操作,如下:
	sed -e ‘cmd‘ file-list
	这种格式下,操作本身需要放在单引号中(也可以使用双引号,二者区别在后面解释)。如果想要同时进行多个操作可以这样:
	sed -e ‘cmd1‘ -e ‘cmd2‘ -e ‘cmd3‘ ... file-list
	看的出来,这很麻烦。于是可以用分号隔开多个操作并放在一对单引号中:
	sed -e ‘cmd1; cmd2; ...‘ file-list
	
	 然后要说的是,在缺少-f以及-e的情况下,sed会默认这是-e,然后把第二个参数直接当成命令。如果该命令只有一个操作,并且是连续的字符串没有空格之类的,那么可以不加单引号;如果是多个操作的话,要放在单引号中,不然会出错。不过为了保险以及培养良好的习惯,最好这样:
	sed ‘cmd1; cmd2; ...‘ file-list

三、选项
	要了解sed所有的选项请在终端输入“man sed”,这里介绍重要的几个。选项一般直接紧跟在sed之后, 在第一个参数之前。
	-n  非常重要的选项,没有它,你会感觉sed啥也没干。。。是这样的,我们使用sed一般只是想处理文本中的某几个行,但是sed在处理完之后会默认把所有的文本包括处理过的那几行全部打印到屏幕上,想要只显示处理过的那几行,就必须加上-n选项。
	-e与-f前面已经介绍了。
	-i 这个就是前面提到的把处理结果写回文件的办法,如下:
		sed -i ‘cmd‘ file
	  当然这只是-i的一个特殊用法,其实-i的本意是备份,即把处理的结果写到一个文件中,而文件的名字就是原文件名加上-i后面的参数,如:
		sed -i .bak ‘cmd‘ file_name
	就会把处理结果写到file_name.bak中,注意bdk前面的点。如果省略-i后面的参数,那么直接替代原文件。
	-r 表示后面的命令支持扩展的正则表达式,没有这个参数就只是基础的正则表达式。其实把单引号直接变成双引号跟使用-r效果是一样的,双引号就表示里面的命令支持扩展的正则表达式。

四、命令	
	 命令就是单引号中的内容,其基本格式为:地址 指令 (指令选项)。有些指令有选项,大多数没有。
	关于地址,它就是我们想要修改的那些行。地址的表示有两种方法:
		(1)模式,用两个斜杠扩起来,表示匹配这个模式的所有行,如
			sed  ‘/dog/  d‘ file  
			这个命令会删除所有包含dog的行,d是删除指令。
			斜杠的两侧可以分别添加指令。下面会看到各种组合。
		(2)数字,就是这个数字代表的行,或者某些数字范围内的行,如
			‘23 d‘   删除第23行
			‘1,4  d‘  删除1到4行,这种范围表示法很想vim
	下面简单介绍下常用的几个指令。
		(1)d  删除指令,上面说过了。
		(2)a 追加指令, 在指定的行后面追加一行内容,其格式为: ‘addr  a  text‘  text是要追加的内容。
			man手册以及某些书籍中,我看到要在a以及text后面加上“\”,用于指代行末尾的换行,本人在ubuntu14上试验了一下,没发现区别。
		(3)i 插入指令,与a指令及其相似,只不过是在指定行的前面添加一行。
		(4)c 修改指令,与前两者相似,只是不再添加行,而是直接用新行替换掉原来指定的行。
		(5)p 打印指, 将指定的行显示在屏幕上。格式与d相同。
		(6)w 写入命令,格式为:‘addr w file‘ ,将范围行写入到指定文件file中。
		(7)s替换指令,与vim中替换指令基本相同,格式为:addr s/old/new/cmd , 这个命令将把addr范围行中的old替换为new,   cmd的成分比较复杂,除了vim中经常出现的g(global,代表全行替换,否则仅仅替换改行的第一个old),还可以是w和p命令。
		(8)r 读入指令,格式为:addr r file,将file的全部内容添加在addr后面。
		(9)q 退出指令,格式为:addr q,在处理完addr的行后,立即退出,不再读入新的行。
		(10)n ”下一条“指令,用于跳过指定的行,读入下一行然后执行下一条指令,其格式为:‘addr n; new cmd‘
		
暂时就写这么多吧,进阶的内容以后再写。同时可以看看这篇文章:http://coolshell.cn/articles/9104.html

sed命令分析