您的位置:首页 > 运维架构 > Linux

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

2017-09-16 15:08 295 查看
一.什么是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的高级编辑命令在介绍高级编辑命令之前,先介绍两个概念,模式空间与保持空间,看下图:


如图,右边的1,2,3,4代表一个有四行的文本,当使用sed的时候,先 将第一行的内容放到模式空间中,再根据具体的命令要求,判断是放入保持空间待处理还是直接输出。1.h把模式空间里的内容复制到保持空间2.H把模式空间里的内容追加到保持空间3.g取出保持空间中的内容,并且复制到模式空间,覆盖原有的内容4.G取出保持空间中的内容,并且复制到模式空间,追加在原有的内容之后5.p列出非打印字符6.n读入下一行输入行,并且从下一条命令开始处理7.N读取匹配到的行的下一行追加到模式空间当中8.q结束或者退出sed9.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行的行改为superman11 .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转换成mytest16.sed -n 's/root/&superman/p' /etc/passwd将passwd文件中的root换成rootsuperman17.sed -e 's/dog/cat/' -e 's/hi/lo/' pets将pets文件中的dog换成cat,hi换成lo18.sed -i.bak 's/dog/cat/g' pets将pets文件中的dog换成cat的同时,生成一个pets.bak文件,此文件是没源文件19.sed -n 'n;p' filen是读取匹配到的行的下一行到覆盖到模式空间,所以当读取第一行后,此时模式空间中是第一行,然而并不会输出第一行而是继续读取第二行到模式空间中,并且覆盖第一行,此时模式空间中只有第二行,则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 倒序显示,当不是第一行的时候,追加保持空间中的行到模式空间,即给第一行的下面加上空行,然后再将第一行以及他下面的空行覆盖到保持空间中,最后如果是最后一行则直接打印出来,不是最后一行的时候,将第一行以及他下面的空行追加到第二行下面,以此类推,最后倒序输出。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux sed