一.什么是sed

   sed是一种新型的,非交互式的编辑器。它没有提供交互式的使用方式,使用者只能在命令行输入编辑命令,指定文件名,然后在屏幕上查看输出。sed编辑器没有破坏习惯,它不会修改文件,除非使用shell来重定向来保存输出结果。而在默认情况下,所有的输出行都会被打印到屏幕上,sed工具有一个

很大的特点就是他是逐行操作的,一行操作过后,继继续下一行。

二.sed命令的基本格式

sed 【 选项】 '命令(command)'  输入文本

三.常用的sed的正则表达式字符

1. ^

行首定位符,表示匹配所有以指定字符开头的行,例如^love表示所有以love开头的行。

2.$

行尾定位符,表示匹配所有以指定字符结尾的行,例如love$表示所有以love结尾的行。

3.  .

匹配除换行外的单个字符,例如l..e表示匹配l开头e结尾中间有两个任意字符的行

4. *

匹配零次或者多次前面的字符,例如*Love,表示匹配在零个或者多个空格后紧跟着一个love的行

5.[]

匹配制定字符串内的任一单一字符,例如[lL]ove表示匹配包含love和Love的行

6.[^]

匹配不在制定字符组内的任一字符,例如[^A-CF-H]ove,表示匹配不是以a-c或者f-h之间开头但是后面包含ove的行

7.\(..\)或者()

表示保存已匹配的字符,以方便在后面继续引用,前者是sed后面的选项没有加-r,即使用标准的正则表达式,而sed后面加上选项-r则表示使用扩展的正则表达式。

8.&

表示保存查找字符串并在后面引用,例如,s/love/*&*/表示将匹配到的行中的love变成*love*

9.\<和\>

\<表示词首定位,\>表示词尾定位,例如,\<love表示匹配包含以love为开头的单词的行, love\>表示匹配包含以love为结尾的单词的行。

10.x\{m\},  x\{m,\}  x\{m,n\}或者x{m},  x{m,}  x{m,n}

分别表示匹配前面的字符串m次,至少m次,m到n次,而两者的区别就是标准正则和扩展正则。

四.sed的常用选项

1. -n

使用安静模式,在一般的情况下所有的标准输入都会打印到屏幕上,加入-n后只会打印出来被sed特殊处理的行

2.-e

多次编辑的作用,而且命令的顺序会影响到命令的执行借股票

3.-f

指定一个sed脚本的文件到命令行执行

4.-r

使用sed的时候使用扩展的正则表达式

5.-i

直接修改文档读取的内容,具有破坏性,并且不在屏幕上输出

6.a\

在匹配到行后添加一行或者多行

7.c\

用新的文本修改或者替换当前行中的文本

8.i\

在匹配到的行的前面插入文本

9.d

删除匹配到的行

10.=

为匹配的模式空间的行打印行号

五.sed的高级编辑命令

在介绍高级编辑命令之前,先介绍两个概念,模式空间与保持空间,看下图:

 linux中sed工具的简单解析与实例参考 _linux sed

 

如图,右边的1,2,3,4代表一个有四行的文本,当使用sed的时候,先 将第一行的内容放到模式空间中,再根据具体的命令要求,判断是放入保持空间待处理还是直接输出。

1.h

把模式空间里的内容复制到保持空间

2.H

把模式空间里的内容追加到保持空间

3.g

取出保持空间中的内容,并且复制到模式空间,覆盖原有的内容

4.G

取出保持空间中的内容,并且复制到模式空间,追加在原有的内容之后

5.p

列出非打印字符

6.n

读入下一行输入行,并且从下一条命令开始处理

7.N

读取匹配到的行的下一行追加到模式空间当中

8.q

结束或者退出sed

9.r

从文件中读取输入行

10.!

对选择的行以外的行做命令处理

11.s

替换标志

.替换标志

1.g

在行内进行全局替换

2.p

打印匹配的行

3.w

将行写入文件

4.x

交换保持空间和模式空间的内容

5.y

将字符转换成另一种字符

.sed命令实例

1.sed '2p' /etc/passwd

匹配passwd文件当中的第二行,但是全部行都会打印出来

2.sed  -n '2p'  /etc/passwd

匹配passwd文件当中的第二行,而且只打印第二行

3.sed -n '1,4p' /etc/passwd

匹配passwd文件中的第一行到第四行,且只打印第一行到第四行

4.sed -n '/root/p'  /etc/passwd

匹配passd文件当中含有root的行,且只打印匹配到的行

5.sed -n '2,/root/p'  /etc/passwd

从第二行开始匹配到第一个含有root的行,并且打印出来

6.sed -n '/^$/='  file

将匹配到的空行打印出来

7.sed -n -e '/^$/p'  -e '/^$/='  file

匹配file文件中的空行,并且显示此空行的行号

8.sed  '/root/a\superman'  /etc/passwd

在含有root行的行后添加superman,会换行

9.sed  '/root/i\superman'  /etc/passwd

在含有root行的行前面添加superman,会换行

10.sed '/root/c\superman'  /etc/passwd

将含有root行的行改为superman

11 .sed  '/^$/d'  file

删除file文件中的空行

12.sed '1,10d' file

删除file文件中的第一行到第十行

13.nl  /etc/passwd | sed '2.5d'

将passwd文件中的行编号显示后,在通过管道删除第二到第五行

14.nl /etc/passwd | sed '2a,tea'

将passwd文件中的行编号显示后,在传递给管道后,在第二行的后面加上,tea,换行

15.sed  's/test/mytest/g'  example

将example文件中的test转换成mytest

16.sed -n 's/root/&superman/p'  /etc/passwd

将passwd文件中的root换成rootsuperman

17.sed  -e 's/dog/cat/'  -e 's/hi/lo/'  pets

将pets文件中的dog换成cat,hi换成lo

18.sed -i.bak  's/dog/cat/g'  pets

将pets文件中的dog换成cat的同时,生成一个pets.bak文件,此文件是没源文件

19.sed  -n  'n;p'  file

n是读取匹配到的行的下一行到覆盖到模式空间,所以当读取第一行后,此时模式空间中是第一行,然而并不会输出第一行而是继续读取第二行到模式空间中,并且覆盖第一行,此时模式空间中只有第二行,则n执行完毕,然后以;为间隔执行下一条p,即将模式空间中的行打印出来,也就是会打印出来第二行的内容,所以最后打印出来的就是第2,4,6,8行,即打印偶数行

20.sed   '1!G;h;$!d' file

先看第一个;前的内容,1!表示不要第一行的内容,G表示从保持空间中提取内容追加到模式空间中,但是此时的保持空间中并没有内容,所以第一个分号前的内容等于是没有任何执行 的结果,此时执行中间的h,即把模式空间中的内容覆盖到保持空间中,即把第一行的内容放到保持空间中,此时保持空间没有内容,也就是保持空间此时只有第一行,然后执行最后一条指令,当当前行不是最后一行的时候,删除模式空间中的行,此时模式空间只有第一行,所以删除模式空间中的第一行,然后开始第二行,读取了第二行后,在模式空间此时只有第二行,然后从保持空间中取出第一行放到第二行的下面,再把这两行覆盖到保持空间中,最后,此时仍然不是最后一行,所以删除模式空间的第二行,以此类推,最后一行的时候,不会被删除,而前面的行会被追加到他的下面,也就是最后一行最后会在最上面而第一行最后会在最下面,所以此指令就是将行倒序显示。

21.sed   'N;D' file

当第一行被放到模式空间的时候,执行N,即在第一行的后面,追加的放了个第二行,此时模式空间中有两行,然后执行D,即删除模式空间中的第一行保留第二行,然后继续执行,将第三行追加到模式空间后,删除

第二行,然后再将第四行追加到模式空间中,以此类推,最后一行的时候,D没有可以删的东西的时候,循环结束,即此命令输出的是最后一行。

22.sed  '$!N;$!D' file

如果不是最后一行的话就在模式空间中的第一行后追加第二行,然后如果不是最后一行的话就删除模式空间中的第一行,接下来第三行追加到模式空间,最后当最后一行的时候,模式空间中只有倒数第二行,将最后一行追加到它的后面循环结束,即输出倒数后两行

23.sed '$!d'  file

如果不是最后一行的话就删除,也就是显示最后一行

24.sed 'G' file

当保持空间内什么也没有的时候,默认追加到模式空间中的行的下面的是空行,此命令也就是给所有行的下方增加空行

25.sed 'g' file

当保持空间内什么也没有的时候,默认覆盖到模式空间中的行的下面的是空行,此命令也就是打印出和源文件行数相同的空行

26.sed  '/^$/d;G'  file

当模式空间中行不是空行的时候给它下面增加一个空行,如果是空行的话就删除这个空行,并且增加一个空行,也就是给源文件中的所有行后面加上空行,并且跳过源文件中的空行

27.sed  'n;d' file

当是第一行的时候变成第二行,然后删除第二行,即输出奇数行,但是若是加上-n ,则什么都不会显示

28.sed -n '1!G;h;$p'  file 

倒序显示,当不是第一行的时候,追加保持空间中的行到模式空间,即给第一行的下面加上空行,然后再将第一行以及他下面的空行覆盖到保持空间中,最后如果是最后一行则直接打印出来,不是最后一行的时候,将第一行以及他下面的空行追加到第二行下面,以此类推,最后倒序输出。