1.sed介绍及工作流程
很多时候我们在linux下面都需要去编辑一些文件。我们所使用的编辑器一般都是vi/vim,vi/vim属于屏幕编辑器,所谓屏幕编辑器是说,我们编辑一个文件的时候,需要把这个文件打开,这里面存在2个问题:1.因为我们需要把这个文件打开,如果说一个较大的文件的话,将会消耗很多的内存。2.当我们在编辑文件的时候,必须要互动,这样的话如果我们在写脚本的时候,是很难调用vim。这个时候我们就需要使用其他的编辑器,sed就是其中一种。
sed属于流编辑器,所谓流编辑器是这样的,sed在编辑文件的时候,首先会把文件的一行内容读入到内存,然后根据我们的需要来进行编辑,读到内存的这部门,我们称为模式空间,修改完,会把模式空间的内容输出到屏幕,然后把模式空间里面的内容清空。读取下一行到模式空间。这样的话就避免了一次性读取整个的文件。
2.sed的基本命令
sed的语法是:sed '范围 操作命令' file
如果说范围我们没有指定的话,那么将会对全文每行进行操作。
有时候我们需要指定操作范围。指定范围的方法有两种:1.直接写一个数字,表示对多少行进行操作。
注意:为了讲解的方便,我们首先来看一个命令d,d是用来删除的
sed '2d' aa这句话的意思是删除文件aa的第二行。如果要删除最后一行:sed '$d' aa
第二种指明范围的方法是正则表达式,如果我们使用正则表达式来表示范围的话,必须要用//来隔开,比如:
sed '/^root/d' aaa,这句命令表示要删除开头为root的行。
sed'1,4d' aa,这句命令表示删除第一行到第四行。
上图的意思是删除第一个包含root的行到第一个包含sync的行,之间所有的行。
我们还有其他命令可以使用,首先我们查看s,s是代替的意思:
sed '范围s/被替换的字符/新字符/标记' file
如果说没有指定范围的话,将会对全文进行操作:
把文件中的rhce全部替换成RHCE。因为我们没有指定任何模式,所以它只会对每行的第一个关键字进行替换。如果说我们想替换所有的,或者替换个别的,我们可以使用标记:
标记g的意思是对每行所有的关键字都要进行替换。如果没有指定g的话,默认只会替换第一个,那如果我们想替换第二或第三个那该如何来完成?
sed 's/rhce/RHCE/2' bb
在标记的位置上我们只要写上一个数字,表示替换模式空间中第几个关键字。
我们在执行替换操作的时候,不一定飞的使用/来隔开,可以使用其他任意字符,比如#.
sed '1s#:#---#3' bb,这个(#)替换只能在s中生效。
sed '范围s/被替换的字符/新字符/标记' file ,在这里老字符部分是支持正则表达式的,但是在新字符的位置是不支持正则表达式的,没有什么特殊字符除了\n、\&
&在替换字符部分是有意义的,代表的意思是引用前面的老关键字。
刚才我们已经讲了两个命令一个d和s,如果我们对特定的范围做多个操作的话,那么我们需要把这多个操作用{}括起来,用;隔开多个命令:
这个命令首先把第一行的rhce全部替换成RHCE,在把第一个RHCE替换成XXX。
从这些操作中我们可以看到,sed它读取文件中的一行,然后操作,操作完成之后,我会把结果显示在屏幕中,如果说我们想看模式空间里面内容的话,可以使用p.
除了正常显示文件所有内容外,还特别的显示模式空间里面的内容。如果我们不想在屏幕输出没有编辑过的那些文件,只要给sed加上 -n就可以了。
刚才我们所讲的是替换一个单词。如果说我们只想替换单个字符的话,我们可以使用y命令:
a替换成x,b替换成y,c替换成z,有一一对应的关系。而不是将abc整体替换成xyz。
a\意思是追加,在关键词后面加上一行内容:
这个命令的意思是在含有DEVICE这行下面新增XXXXXXX这么一行内容。
i\意思是在关键词的上一行产生一行内容。
sed '/DEVICE/i\XXXXXXXXXXXXXX' ifcfg-eth0
如果我想修改某行内容的话,可以使用c\。
sed '/ONBOOT/cONBOOT=yes' bb
这句话的意思是把含有ONBOOT的这行内容替换成ONBOOT=yes.
大家要记住一点,以上所有操作都是在模式空间里面做的,并没有改变源文件内容。如果说我们想改变源文件内容,只要对sed加上-i选项就行了。
当我们加上-i选项,屏幕上并没有任何输出,因为这样操作的话,它直接改变了源文件的内容。