Linux三剑客之SED

这里写图片描述

SED是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。


SED的命令执行流程

这里写图片描述

sed会从数据中一条一条的读取命令,逐条处理和输出,直到数据的最后一行。

模式空间:sed软件内部的一个临时缓存,用于存放读取到的内容。


SED命令和功能

  • 命令格式
  sed [options] [command] [inputfile(s)]
  sed [options] -f scriptfile

文中统一实验文件

[root@CentOS7 ~]$cat test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr
  • 选项

-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f: /PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑
-h或–help:显示帮助
-V或–version:显示版本信息

  • sed命令

a\ -在当前行下面插入文本。
i\ -在当前行上面插入文本。
d -删除,删除选择的行。
D -删除模板块的第一行。
s -替换指定字符
h -拷贝模板块的内容到内存中的缓冲区。
H -追加模板块的内容到内存中的缓冲区。
g - 获得内存缓冲区的内容,并替代当前模板块中的文本。
G -获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l -列表不能打印字符的清单。
n -读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N -追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p -打印模板块的行。 P(大写) 打印模板块的第一行。
q -退出Sed。
! -表示后面的命令对所有没有被选定的行发生作用。
= -打印当前行号码。 # 把注释扩展到下一个换行符以前。

查找替换

  s///:查找替换,支持使用其它分隔符, s@@@, s###替换标记:
     g: 行内全局替换
     p: 显示替换成功的行
     w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

地址定界:

 (1) 不给地址:对全文进行处理

 (2) 单地址:
           #:指定的行
           /pattern/:被此处模式所能够匹配到的每一行

 (3) 地址范围:
           #,#
           #,+#
           /pat1/,/pat2/
           #,/pat1/

 (4) ~:步进
          1~2 奇数行
          2~2 偶数行

实例演示

1、输出原数据并打印第二行

[root@CentOS7 ~]$sed '2p' test
aaa,bbb,ccc
ddd,eee,fff
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr

2、只打印数据第二行

[root@CentOS7 ~]$sed -n '2p' test  
ddd,eee,fff

3、打印1到4行

[root@CentOS7 ~]$sed -n '1,4p' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll

4、只打印含有“ggg”的行

[root@CentOS7 ~]$sed -n '/ggg/p' test   
ggg,hhh,iii

5、打印从第二行到含有”ggg”的行

[root@CentOS7 ~]$sed -n '2,/ggg/p' test
ddd,eee,fff
ggg,hhh,iii

6、显示空行行号

[root@CentOS7 ~]$sed -n '/^$/=' test 
6

7、打印空行和空行行号

sed -n -e '/^$/p' -e '/^$/=' test

6

8、在含有“ggg”的行后加入“test”

[root@CentOS7 ~]$sed '/ggg/a\test' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
test
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr

9、在含有“ggg”行前加上“test”

[root@CentOS7 ~]$sed '/ggg/i\test' test 
aaa,bbb,ccc
ddd,eee,fff
test
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr

10、将含有“ggg”的行替换成“test”

[root@CentOS7 ~]$sed '/ggg/c\test' test
aaa,bbb,ccc
ddd,eee,fff
test
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr

11、删除空行

[root@CentOS7 ~]$sed '/^$/d' test
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo
ppp,qqq,rrr

12、将文件中前3行删除

[root@CentOS7 ~]$sed '1,3d' test
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr

13、使用管道删除2到4行

[root@CentOS7 ~]$nl test | sed '2,4d'
     1  aaa,bbb,ccc
     5  mmm,nnn,ooo

     6  ppp,qqq,rrr

14、将文件中的“ggg”替换成“XXX”

[root@CentOS7 ~]$sed 's/g/X/g' test
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr
[root@CentOS7 ~]$sed 's/ggg/XXX/' test                   
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr

15、在“ggg”单词前加入“XXX”

[root@CentOS7 ~]$sed -n 's/ggg/XXX&/p' test
XXXggg,hhh,iii

16、在“ggg”单词后面加入“XXX”

[root@CentOS7 ~]$sed -n 's/ggg/&XXX/p' test 
gggXXX,hhh,iii

17、将“ggg”替换成“XXX”,并将“ooo”替换成“YYY”

[root@CentOS7 ~]$sed -e 's/g/X/g' -e 's/ooo/YYY/' test
aaa,bbb,ccc
ddd,eee,fff
XXX,hhh,iii
jjj,kkk,lll
mmm,nnn,YYY

ppp,qqq,rrr

18、将“ggg”替换成“XXX”并备份一份.bak文件

[root@CentOS7 ~]$sed -i.bak 's/ggg/xxx/' test
[root@CentOS7 ~]$cat test.bak 
aaa,bbb,ccc
ddd,eee,fff
ggg,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr
[root@CentOS7 ~]$cat test
aaa,bbb,ccc
ddd,eee,fff
xxx,hhh,iii
jjj,kkk,lll
mmm,nnn,ooo

ppp,qqq,rrr

19、打印奇数行

[root@CentOS7 ~]$cat test | sed -n '1~2p'
aaa,bbb,ccc
ggg,hhh,iii
mmm,nnn,ooo
ppp,qqq,rrr

20、打印偶数行

[root@CentOS7 ~]$cat test | sed -n '2~2p'
ddd,eee,fff
jjj,kkk,lll
[root@CentOS7 ~]$sed -n 'n;p' test
ddd,eee,fff
jjj,kkk,lll

21、倒叙显示文件内容

[root@CentOS7 ~]$sed '1!G;h;$!d' test 
ppp,qqq,rrr

mmm,nnn,ooo
jjj,kkk,lll
ggg,hhh,iii
ddd,eee,fff
aaa,bbb,ccc
[root@CentOS7 ~]$sed -n '1!G;h;$p' test
ppp,qqq,rrr

mmm,nnn,ooo
jjj,kkk,lll
ggg,hhh,iii
ddd,eee,fff
aaa,bbb,ccc

22、显示文件的最后一行

[root@CentOS7 ~]$sed 'N;D' test
ppp,qqq,rrr
[root@CentOS7 ~]$sed '$!d' test
ppp,qqq,rrr

23、显示文件的最后两行

[root@CentOS7 ~]$sed '$!N;$!D' test

ppp,qqq,rrr

24、每行后面加入空行

[root@CentOS7 ~]$sed 'G' test   
aaa,bbb,ccc

ddd,eee,fff

ggg,hhh,iii

jjj,kkk,lll

mmm,nnn,ooo



ppp,qqq,rrr

25、将文件所有内容改成空行

[root@CentOS7 ~]$sed 'g' test 






26、将文件中空行删除,之后在每行后面插入空行

[root@CentOS7 ~]$sed '/^$/d;G' test 
aaa,bbb,ccc

ddd,eee,fff

ggg,hhh,iii

jjj,kkk,lll

mmm,nnn,ooo

ppp,qqq,rrr

27、删除文件中的偶数行

[root@CentOS7 ~]$sed 'n;d' test
aaa,bbb,ccc
ggg,hhh,iii
mmm,nnn,ooo
ppp,qqq,rrr
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值