当前位置: 首页 > Linux

每天一个Linux命令(三):sed

时间:2023-04-06 21:18:39 Linux

推荐:每天一个Linux命令(二):od功能介绍sed是一个流编辑器,是一个非常好的文本处理工具。当使用正则表达式进行更强大的处理时,将当前处理的行存储在一个临时缓冲区中,称为“模式空间”,然后使用sed命令处理缓冲区的内容,完成后输出到屏幕,再处理下一个线。除非使用-i选项,否则不会更改文件的内容。sed主要用于编辑一个或多个文件,简化对文件的重复操作或编写转换程序等。sed的功能类似于awk,不同的是sed简单,处理列的功能较弱,而awk功能复杂,处理列的功能更强大。命令格式sed[options]'command'file(s)sed[options]-fscriptfilefile(s)常用参数-e#用指定的命令处理输入的文本文件-n#取消默认输出(if和p命令同时,只打印改变的行)-h#帮助-V#显示版本信息常用操作a#在当前行下方插入文本i#在当前行上方插入文本c#将选中的行更改为新文本d#Delete,删除选中的行D#删除模板块的第一行s#替换指定字符h#复制模板块的内容到内存中的缓冲区H#追加模板块的内容到缓冲区inmemoryg#获取内存缓冲区的内容,替换当前模板块中的文本G#获取内存缓冲区的内容,追加到当前模板块文本的后面l#不能打印的字符列表n#读取下一个输入行,使用下一个命令而不是第一个命令处理新行N#将下一个输入行追加到模板块的末尾并在其间插入一个新行,更改当前行号p#打印匹配行P#(大写)打印模板第一行q#exitSedb#lable分支到脚本中有标签的地方,如果分支不存在,则分支到脚本末尾r#file从文件中读取行t#labelifbranch,从最后一行开始,一旦满足条件或者t,t命令,就会跳转到有label的命令,或者结束脚本T#label错误分支,从最后一行开始,一旦出现错误或者T,t命令,就会引发一个分支,转到带有label的命令,或者到脚本的末尾w#filewriteandappend模板块到文件末尾**W#filewrite并将模板块的第一行附加到文件末尾**!#表示后面的命令对所有未选中的行生效**=#打印当前行号**##将注释扩展到下一个换行符**sed替换命令g#表示行内全替换(使用全局替换)用s命令)p#表示打印行w#表示将该行写入文件x#表示交换模板块中的文本和缓冲区中的文本y#表示将一个字符翻译成另一个字符(但不是用于正则表达式)1#子串匹配标记&#匹配字符串标记Sed正则^#匹配行开始$#匹配行结束。#匹配任何不是换行符的字符*#匹配0个或多个字符[]#匹配指定范围内的字符[^]#匹配不在指定范围内的字符(..)#匹配子串&#保存搜索字符替换其他字符<#匹配单词的开头>#匹配单词的结尾x{m}#重复字符x,m次x{m,}#重复字符x,至少m次x{m,n}#重复字符x,最少m次,不超过n次sed常见例子1、替换操作echo"helloworld"|sed's//-/1g'hello-world#全局用-从第一个空格开始替换,但是文本2中只有一个空格删除操作sed'/^$/d'filename#删除空行sed'2d'filename#删除第二行sed'2,$d'filename#删除所有行从第二个到最后sed'$d'filename#删除最后一行sed'/^test/'dfilename#删除test3开头的行,匹配替换echo"helloworld"|sed's/w+/[&]/g'[hello][world]echo"helloworld"|sed's/w+/"&"/g'"hello""world"#w+匹配每一个词,&表示匹配的字符串echoAAAbbb|sed's/([A-Z]+)([a-z]+)/[2][1]/'[bbb][AAA]#子串匹配替换4、选择范围sed-n'/=0/,/最大/p'svnserve。conf#min-encryption=0#max-encryption=256#将打印出=0到max范围内的所有行5、sed多点编辑功能(-e)[root@centos001~]#cat-ntest1这是一个测试文件2welcome3to4here5helloWORLD67linuxcentos6.88redhatsed-e'2,6d'-e's/linuxcentos6.8/LinuxCentos6.8/'test这是一个测试文件LinuxCentos6.8redhat#if两条命令的功能是一样的,那么需要使用下面的参数sed--expression='s/linuxcentos6.8/LinuxCentos6.8/'--expression='s/to/TO/'test**这是一个测试文件welcomeTOherehelloWORLDLinuxCentTOs6.8redhat6,读写[root@centos001~]#cattest1welcomtohere[root@centos001~]#sed'/here/rtest1'testthis是一个testfilewelcometohere#welcomtohere#helloWORLDlinuxcentos6.8redhat#读取test1的文件内容,显示这里匹配的所有行sed-n'/centos6.8/wtest2'test[root@centos001~]#cattest2linuxcentos6.8#将test文件匹配到centos6.8的所有行写入test2文件,该文件可能不存在。#如果文件存在,则重定向,而不是追加7,追加插入[root@centos001~]#sed'/^l/a2017-08-08'test2linuxcentos6.82017-08-08#添加2017-08-08[root@centos001~]#sed'1a2017-08-匹配l开头的行后08'test2linuxcentos6.82017-08-08#在第一行之后添加2017-08-08[root@centos001~]#sed'/^l/i2017-08-08'test22017-08-08linuxcentos6.8#Insert2017-08-08#######以上操作不会改变文件内容#################[root@centos001~]#sed-i'/^l/i2017-08-08'test2[root@centos001~]#cattest22017-08-08linuxcentos6.88,其他命令示例[root@centos001~]#cat-ntest212017-08-082linuxcentos6.830845测试[root@centos001~]#**sed'/08/{n;秒/二/;}'test22017-08-08Linuxcentos6.808test#如果匹配到08,则跳到下一行,将小写的l换成大写,注意第三行也匹配上了#但是不满足下面的条件,都没有替换[root@centos001~]#sed'1,4y/8/9/'test22017-09-09linuxcentos6.909test#将第1行到第4行中的所有数字8替换为9[root@centos001~]#**sed'1q'test2**2017-08-08#打印完第一行9后退出,打印奇数或公共偶数行[root@centos001~]#sed-n'p;n'test22017080808[root@centos001~]#sed-n'n;p'test2linuxcentos6.8test[root@centos001~]#sed-n'1~2p'test22017080808[root@centos001~]#sed-n'2~2p'test2linuxcentos6.8test10,打印下一行匹配字符串行[root@centos001~]#sed-n'/linux/{n;p}'test208[root@centos001~]#awk'/linux/{getline;每天打印}'test208一条Linux命令(一):xargs