sed全称(streameditor)流式编辑器,Sed主要用来自动编辑一个或多个文件、简化对文件的反复操作、编写转换程序等,工作流程如下 >sed是一种在线的、非交互式的编辑器,它一次处理一行内容,它是文本处理中非常好的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(patternspace),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出,或者使用sed-i选项 #-i选项就是将本该输出到屏幕上的内容输出/流入文件中。Sed主要用来自动编辑一个或多个文件,可以将数据行进行替换、删除、新增、选取等特定工作,简化对文件的反复操作,编写转换程序等 2、sed格式 sed[options]'command'file(s); sed[options]-fscriptfilefile(s); sed和grep不一样,不管是否找到指定的模式,它的退出状态都是0 只有当命令存在语法错误时,sed的退出状态才不是0 二、sed选项与基本用法 -n:#取消默认的输出(模式空间的内容输出),只打印模式匹配的行; -i:#inplace,就地编辑,直接修改文件内容; -V或--version:#显示版本信息 #文件的一行行内容相当与水流,连续两个-e就是设置了两道关卡 [root@aliyun~]#sed''test.txt [root@aliyun~]#sed-e'3d'-e'1d'test.txt [root@aliyun~]#sed-rn-e'1,3d'-e'p'test.txt #也可以将多道关卡写入一个文件中 [root@aliyun~]#catsed.txt [root@aliyun~]#sed-rn-fsed.txttest.txt [root@aliyun~]# 2、sed命令组成 命令由”地址+命令“两部分组成,命令如p、d,更多详解第三章节,本节我们主要介绍地址 地址用于决定对流入模式空间的哪些行进行编辑,如果没有指定地址,sed将处理流入模式空间的所有行。 sed'1,47d'/etc/passwd 与grep一样,sed在文件中查找模式时也可以使用正则表达式(RE)和各种元字符。正则表达式是 括在斜杠间的模式,用于查找和替换,以下是sed支持的元字符。 ^,$,.,*,[],[^],\<\>,\(\),\{\} [root@aliyun~]#cattest.txt [root@aliyun~]#sed-rn'/egon/p'test.txt [root@aliyun~]cattest.txt [root@aliyun~]#sed-rn'1,/egon/p'test.txt [root@aliyun~]egon#p'test.txt [root@aliyun~]egon#p'test.txt [root@aliyun~]sed-rn'/egon/p'test.txt [root@aliyun~]#sed-rn'/egon/p'test.txt [root@aliyun~]# 如果匹配的正则里有左斜杠,要么将正则转义,要么将c转义 sed:-eexpression#1,char0:nopreviousregularexpression [root@aliyun~]/etc/egon/666转义c,必须是\c [root@aliyun~]/etc/egon/666转义c [root@aliyun~]#sed-ri'//etc/egon/666/s/.*/xxx/'a.txt [root@aliyun~]# 三、sed常用命令 sed命令告诉sed对指定行进行何种操作,包括打印、删除、修改等。 a在当前行后添加一行或多行 c用新文本修改(替换)当前行中的文本 l会用$符号标识出文件中看不到的字符的位置 n把下一行内容读入模式空间,后续的处理命令处理的都是刚读入的新内容 q结束或退出sed,不会将后续内容读入模式空间 !对所选行以外的所有行应用命令 y将字符转换为另一字符(不支持正则表达式),y/egon/1234/e->1g->2o->3n->4 h把模式空间里的内容复制到暂存缓冲区(覆盖) H把模式空间里的内容追加到暂存缓冲区 g取出暂存缓冲区的内容,将其复制到模式空间,覆盖该处原有内容 G取出暂存缓冲区的内容,将其复制到模式空间,追加在原有内容后面 N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码; x交换暂存缓冲区与模式空间的内容 c\把选定的行改为新的文本; h拷贝模板块的内容到内存中的缓冲区; H追加模板块的内容到内存中的缓冲区; g获得内存缓冲区的内容,并替代当前模板块中的文本; G获得内存缓冲区的内容,并追加到当前模板块文本的后面; n读取下一个输入行,用下一个命令处理新的行而不是用第一个命令; N追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码; p打印模板块的行。P(大写)打印模板块的第一行; blable分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾; tlabelif分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾; Tlabel错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾; wfile写并追加模板块到file末尾; Wfile写并追加模板块的第一行到file末尾; !表示后面的命令对所有没有被选定的行发生作用;=打印当前行号; #把注释扩展到下一个换行符以前; x表示互换模板块中的文本和缓冲区中的文本; y表示把一个字符翻译为另外的字符(但是不用于正则表达式); ^匹配行开始,如:/^sed/匹配所有以sed开头的行; $匹配行结束,如:/sed$/匹配所有以sed结尾的行; .匹配一个非换行符的任意字符,如:/s.d/匹配s后接一个任意字符,最后是d; *匹配0个或多个字符,如:,love这成**love**; \<匹配单词的开始,如:/\ \>匹配单词的结束,如/love\>/匹配包含以love结尾的单词的行; x\{m\}重复字符x,m次,如:/0\{5\}/匹配包含5个0的行; x\{m,\}重复字符x,至少m次,如:/0\{5,\}/匹配至少有5个0的行; x\{m,n\}重复字符x,至少m次,不多于n次,如:/0\{5,10\}/匹配5~10个0的行; -n选项和p命令一起使用表示只打印那些发生替换的行: 直接编辑文件选项-i,会匹配file文件中每一行的第一个book替换为books sed-i's/book/books/g'file 使用后缀/g标记会替换每一行中的所有匹配: 当需要从第N处匹配开始替换时,可以使用/Ng: echosksksksksksk|sed's/sk/SK/2g' echosksksksksksk|sed's/sk/SK/3g' echosksksksksksk|sed's/sk/SK/4g' 以上命令中字符/在sed中作为定界符使用,也可以使用任意的定界符 定界符出现在样式内部时,需要进行转义: sed's//bin//usr/local/bin/g' 删除文件的第2行到末尾所有行: 删除文件中所有开头是test的行: 正则表达式\w\+匹配每一个单词,使用[&]替换它,&对应于之前所匹配到的单词: echothisisatestline|sed's/\w\+/[&]/g' [this][is][a][test][line] 所有以192.168.0.1开头的行都会被替换成它自已加localhost: sed's/^192.168.0.1/&localhost/'file192.168.0.1localhost 匹配给定样式的其中一部分: echothisisdigit7inanumber|sed's/digit\([0-9]\)//' 命令中digit7,被替换成了7。样式匹配到的子串是7,\(..\)用于匹配子串,对于匹配到的第一个子串就标记为,依此类推匹配到的第二个结果就是,例如: echoaaaBBB|sed's/\([a-z]\+\)\([A-Z]\+\)//' sed-n's/\(love\)able/rs/p'file sed'表达式'|sed'表达式'等价于: sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号。 echohelloWORLD|sed"s/$test/HELLO" 所有在模板test和check所确定的范围内的行都被打印: sed-n'/test/,/check/p'file 打印从第5行开始到第一个包含以test开始的行之间的所有行: 对于模板test和west之间的行,每行的末尾用字符串aaabbb替换: sed'/test/,/west/s/$/aaabbb/'file -e选项允许在同一行里执行多条命令: sed-e'1,5d'-e's/test/check/'file 上面sed表达式的第一条命令删除1至5行,第二条命令用check替换test。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。 和-e等价的命令是--expression: sed--expression='s/test/check/'--expression='/love/d'file file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面: 在example中所有包含test的行都被写入file里: sed-n'/test/wfile'example 将thisisatestline追加到以test开头的行后面: sed'/^test/a hisisatestline'file 在test.conf文件第2行之后插入thisisatestline: sed-i'2a hisisatestline'test.conf i\命令将thisisatestline追加到以test开头的行前面: sed'/^test/i hisisatestline'file 在test.conf文件第5行之前插入thisisatestline: sed-i'5i hisisatestline'test.conf 如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续: sed'/test/{n;s/aa/bb/;}'file 把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令: sed'1,10y/abcde/ABCDE/'file 打印完第10行后,退出sedsed'10q'file保持和获取:h命令和G命令在sed处理文件的时候,每一行都被保存在一个叫模式空间的临时缓冲区中,除非行被删除或者输出被取消,否则所有被处理的行都将打印在屏幕上。接着模式空间被清空,并存入新的一行等待处理。 在这个例子里,匹配test的行被找到后,将存入模式空间,h命令将其复制并存入一个称为保持缓存区的特殊缓冲区内。第二条语句的意思是,当到达最后一行后,G命令取出保持缓冲区的行,然后把它放回模式空间中,且追加到现在已经存在于模式空间中的行的末尾。在这个例子中就是追加到最后一行。简单来说,任何包含test的行都被复制并追加到该文件的末尾。 互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换: sed-e'/test/h'-e'/check/x'file sed脚本是一个sed的命令清单,启动Sed时以-f选项引导脚本文件名。Sed对于脚本中输入的命令非常挑剔,在命令的末尾不能有任何空白或文本,如果在一行中有多个命令,要用分号分隔。以#开头的行为注释行,且不能跨行。 sed[options]-fscriptfilefile(s) sed-n'1~2p'test.txt偶数行 awk'/SCC/{getline;print}' 删除命令:d,注意用单引号 只删除模式匹配成功的第一行 [root@hzl~]只删除模式匹配成功的所有行 [root@hzl~]只删除模式匹配成功的第一行 #sed-r's/egon/Bigegon/'a.txt #sed-r's/egon/Bigegon/g'a.txt #sed-r's/^egon/Bigegon/g'a.txt #sed-r-n's/root/egon/gip'/etc/passwd &代表取到匹配成功的整行内容 #sed-r's/^([a-zA-Z]+)([^[a-zA-Z]+)//'a.txt 在前一个-e的基础之上进行第二个-e操作 #sed-r'1,3d;s/[Ee]gon/EGON/g'a.txt ;分隔依次运行,先针对第一行进行p操作,再针对所有行进行p操作 只针对第一行,连续进行两次p操作 在匹配成功的行后添加文件b.txt的内容 在第2行后面添加文件b.txt的内容 将匹配成功的行写入新文件b.txt 将第3行到最后一行写入/root/new.txt #sed-r'2i1111111111111'/etc/hosts #sed-r'2c1111111111111'a.txt 把下一行内容读入模式空间:n 将匹配/^Egon/成功的行的下一行读入模式空间进行s处理 [root@aliyun~]/etc/egon/666#n;c1111'a.txt 1到3行进行转换对应规则:a->1e->2o->X 匹配成功/[Ee]gon/则执行{}内命令,q代表退出,即替换一次则退出,如果文件中多行符合规则的内容也只替换了第一个 四、模式空间与保持空间 1、sed有两个内置的存储空间: 如你所知,模式空间用于sed执行的正常流程中。该空间sed内置的一个缓冲区,用来存放、修改从输入文件读取的内容。 保持空间是另外一个缓冲区,用来存放临时数据。Sed可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的sed命令。 2、模式空间与保持空间的操作命令 x:命令x(exchange)用于交换模式空间和保持空间的内容 h:模式空间复制/覆盖到保持空间 H:模式空间追加到保持空间 g:保持空间复制/覆盖到模式空间 G:保持空间追加到模式空间 n:读取下一行到/覆盖到模式空间 N:将下一行添加到模式空间 d:删除patternspace中的所有行,并读入下一新行到patternspace中 #======================方式2:======================思路: #1、读取文件第一行内容到模式空间,进行的操作如下 #将模式空间内容覆盖到保持空间 #2、读取文件第二行内容到模式空间,进行的操作如下 #将保持内容追加到模式空间 #将模式空间内容覆盖到保持空间 #3、读取文件第三行内容到模式空间,进行的操作如下 #将保持空间内容追加到模式空间 sed-r'1h;1d;2G;2h;2d;3G'test.txt sed'1!G;h;$!d'test.txt 五、sed脚本 sed脚本就是写在文件中的一系列sed命令,使用-f选项指定sed脚本文件名,需要注意的问题如下 脚本末尾不能有任何多余的空格或文本 如果命令不能独占一行,就必须以\结尾 脚本中不能使用引号,除非它们是查找串的一部分 [root@egon~]永久存储,存了多行sed命令,相当于多道关卡,每读入一行内容将经历一道道关卡 [root@egon~]#sed-r''a.txt [root@egon~]#sed-r-fsed.shtest.txt [root@egon~]# 六、sed使用练习 sed-r-i'/^[ ]*#/d'file.conf 删除配置文件中用双斜杠//注释的行 sed-r'/^[ ]*$/d'file.conf sed-r'/^[ ]*$/d'file.conf sed-r-i'/^[ ]*#/d;/^[ ]*$/d'/etc/vsftpd/vsftpd.conf 追加一行,\可有可无,有更清晰 sed-r-i'$a\chroot_local_user=YES'/etc/vsftpd/vsftpd.conf sed-r-i'10,$s/^/#/'filename sed-r'3,$s/^/'filename换成一个# 也可以加引号,但注意是双引号而不是单引号,因为要用$符号取变量值 也可以sed命令用''引起来,而变量用"",注意二者之间不能有空格 以上就是linux的sed命令如何使用的详细内容,更多请关注主机测评网其它相关文章! 本文来源:国外服务器--linux的sed命令如何使用(linux中sed详细用法) 本文地址:https://www.idcbaba.com/guowai/2651.html 版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 1919100645@qq.com 举报,一经查实,本站将立刻删除。
如本文对您有帮助,就请抽根烟吧!
- 支付宝打赏
微信打赏

