sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
然后读入下一行,执行下一个循环。这样不断重复,直到文件最后。文件内容并没有改变,除非使用重定向存储输出。
sed语法:sed [option]……'script' inputfile……
常用选项:
-n #不输出模式空间内容到屏幕,即不自动打印到屏幕
-e #多点编辑
-f /PATH/SCRIPT_FILE #从指定文件中读取编辑脚本
-r #支持扩展的正则表达式
-i.bak #备份文件并原处编辑,.bak可以自定义
一、script,地址命令
地址定界:
1、不给地址,则对全文进行处理
2、单地址:n:指定的行,$:最后一行
/pattern/:被此处模式所能匹配到的每一行
3、地址范围
n1,n2 #意思为文本的n1行到n2行
n,+m #意思为显示n行,以及其后面的m行
/pat1/,/part2/ #从匹配到pat1的行到part2的行
n,/pat1/ #从n行开始,到pat1行结束
4、~:步进
1~2 #奇数行
2~2 #偶数行
举例:打印指定行的内容到屏幕
执行命令:sed -n 'p' fstab #后面的p是指将匹配到前面的地址的内容打印到屏幕,这里前面的地址范围为空,则表示匹配文件所有的行
执行命令:sed -n '2,3p' fstab #只打印第2行到第3行的内容到屏幕
执行命令: sed -n '6,$p' fstab #只打印出第6行到文本最后一行得内容
执行命令:sed -n '/^#/p' fstab #匹配/ /中的模式,打印出以#开头的行
执行命令:sed -n '2,/\/dev\/disk/p' fstab #打印第二行到包含/dev/disk的行的所有内容
执行命令:sed -n '/\/etc\/fstab/,/xfs/p' fstab #打印出从包含/etc/fstab的行到包含xfs的行的内容
执行命令:sed -n '1~2p' fstab #打印出文档中的奇数行
执行命令:sed -n '2~2p' fstab #打印出文本的偶数行
二、sed的编辑命令
d #删除模式空间匹配的行,并开启下一轮循环
p #打印出模式匹配的行,追加到默认输出的后面
a [\]text #在指定的行后面追加一行,支持使用\n追加多行
i [\]text #在指定的行前面追加一行,支持使用\n追加多行
c [\]text #替换行为单行或多行文本
w /path/file #保存模式匹配的行至指定文件
r /path/file #读取指定文件的文本至模式空间中匹配到的行的行后
= #为模式空间中的行打印行号
! #模式空间中匹配行取反处理
举例:打印出除/dev/mapper所在行的所有行
执行命令:sed -n '/\/dev\/mapper/d;p' fstab #删除模式匹配到的行,然后打印出来,中间;表示执行完第一个命令后执行第二个命令
执行命令:sed '3p' fstab #没有加n意思为打印出所以的文本,将第三行的内容追加到第三行后面
执行命令:sed '/^UUID/a\this is a test' fstab #在UUID后面追加一行文本,this is a test
执行命令:sed '/^UUID/i\this is a test' fstab #在匹配的行的前面追加一行文本
执行命令:sed '/^UUID/c\this is a test\na test' fstab #将匹配到的行替换为指定的文本内容,\n意为换行
执行命令:sed -n '/^UUID/w/root/fstab1' fstab
执行命令:sed '/UUID/r/root/zhuijia' fstab #将/root/zhuijia中的内容追加到匹配到的行的后面
执行命令:sed -n '/UUID/=' fstab #打印出含有该字符的行的行号
执行命令:sed -n '/UUID/!p' fstab #打印除匹配到的行以外的所有的行
三、sed工具
s/// #查找替换,支持使用s@@@或者s###
g #行内全局替换
p #显示替换成功的行
w /path/file #将替换成功的行保存至文件中
举例:将fstab文件中的#全部去掉,然后打印出来
执行命令:sed -nr 's/# *//g;p' fstab #将所有的#且后面至少有一个空格的内容替换成无,然后选择所有行,并打印出来
举例:取出UUID=后面的那一串数字,并打印出来
执行命令:sed -nr 's/UUID=(*) \/boot*/\1/p' fstab #利用正则的分组,将等号后面的内容取出并打印
四、sed高级应用
P #打印模式空间开端至\n内容(即模式空间第一行内容),并追加到默认输出之前
h #把模式空间中的内容覆盖至保持空间中
H #把模式空间中的内容追加至保持空间中
g #从保持空间取出数据覆盖至模式空间
G #从保持空间取出内容追加至模式空间
x #把模式空间中的内容与保持空间中的内容进行互换
n #读取匹配到的行的下一行覆盖至模式空间
N #读取匹配到的行的下一行追加至模式空间
d #删除模式空间中的行
D #如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使
用合成的模式空间重新启动循环。如模式空间不包含换行符,则会像发出d命令那样启动正常的新的循环。
保持空间:即在sed处理数据时,数据的一个暂存空间,sed默认是处理完一行的数据后,就清空模式空间的内容,继续进行下一一行的数据处理,保持空间则能暂时的存放数据。
举例:打印文本的偶数行内容
执行命令:sed -n 'n;p' num
sed的处理过程:
sed第一次取数据到模式空间时,因为有n参数,所以sed就把第二行的数据取出并覆盖到模式空间中,此时模式空间就只有第二行数据,然后执行p操作打印
sed第二次取数据时,由于第二行数据已经取过了,所以从第三行开始取,取的时候,仍然受到n参数影响,所以sed把第四行的数据取出放到了模式空间中,并打印。
sed的后续也是按照上面的那种方法取出数据,所以sed取出的数据应该依次为:第二行数据、第四行数据、第六行数据……即文本的所有偶数行,然后通过p选项打印到屏幕
举例:倒序显示文本内容
执行命令:sed '1!G;h;$!d' num
sed工作过程:
sed第一次取数据:运行1!G时,由于是第一行,所以不需要执行G操作,然后在执行h操作,即将第一行数据覆盖到保持空间中,然后删除模式空间中的行。
此时模式空间中为空,保持空间中为第一行数据
sed第二次取数据:由于是非首行,执行G操作,将保持空间中的第一行取出追加到模式空间的的第二行的后面,再执行h操作,将第一行第二行复制到保
持空间中,并删除模式空间的内容,此时模式空间为空,保持数据为第二行和第一行
如上执行过程,直到遇到了最后一行,将保持空间中的数据第9、8、、6、5、4、3、2、1行追加到模式空间中,由于是最后一行,不执行d动作,此时的
模式空间中数据为:第10、9、8、7、6、5、4、3、2、1行,由于sed默认打印出所有处理过的行,而之前的操作模式空间都为空,所以不打印,到了最
后一行,将模式空间中的数据打印出来。
举例:打印出文本的最后一行
执行命令:sed 'N;D' num
sed工作过程:
sed第一次取数据:读取第一行,然后执行N操作,将第二行的数据追加到模式空间,而后执行D操作,由于模式空间中有换行符,删除模式空间的第一行,即
模式空间中的数据为第二行。
sed第二次取数据:读取第由于第二行已经被取过了,这里取第三行,同上删除第一行,模式空间中的数据为第四行
在此合成的模式空间启动循环,直至再也没有新的行读入,模式空间中就只有最后一行数据。然后打印到屏幕。