1、sed流编辑器
(1)简介
Sed是一款流编辑工具,主要对文本进行过滤以及替换操作。
(2)sed基本语法
sed [-hnV][-e][-f][文本文件]
参数选项:
-a:在当前行下面插入文件-n:读取下一个输入行,用下一个命令处理新的行-e:执行多个指令-f:运行脚本-i:编辑文件内容-i.bak编辑的同时创造.bak的备份-r:使用扩展的正则表达式-V:显示版本信息
命令选项:
i:在当前行上面插入文件,追加c:把选定的行改为新的指定的文本,更改p:打印d:删除r/R:读取文件/一行w:另存s:查找并替换,取代y:按字符转换h:拷贝模板块的内容到内存中的缓冲区。H:追加模板块的内容到内存中的缓冲区。g:获得内存缓冲区的内容,并替代当前模板块中的文本。G:获得内存缓冲区的内容,并追加到当前模板块文本的后面 D:删除\n 之前的内容P:打印\n 之前的内容
替换标记:
数字:表明新文本将替换第几处模式匹配的地方g:表示新文本将会替换所有匹配的文本\n:匹配第n个子串&:用正则表达式匹配的内容进行替换
sed 匹配字符集
^ 匹配行开始,如:/^root/匹配所有以root开头的行。$ 匹配行结束,如:/root$/匹配所有以root结尾的行。. 匹配一个非换行符的任意字符,如:/s.l/匹配 s 后接一个任意字符,最后是l。* 匹配 0 个或多个字符,如:/*shell/匹配所有模板是一个或多个空格后紧跟shell的行。
(3)常用实例
A、替换
文本每行行首插入#号
[root@test ~]# sed 's/^/#/g' /etc/passwd
注:使用-i参数会直接修改文本。
查找文本中含root的行,并将root改为test
[root@test ~]# sed -n '/root/p' /etc/passwd |sed 's/root/test/'test:x:0:0:root:/root:/bin/bashoperator:x:11:0:operator:/test:/sbin/nologin
注:-n只显示被处理后的行
所有已root开头的行,都会被替换成roottest。
[root@test ~]# sed 's/^root/&test/' /etc/passwdroottest:x:0:0:root:/root:/bin/bash
不论什么字符,紧跟着s命令的都被认为是新的分隔符,#在这里是分隔符,代替了默认的/分隔符
[root@test ~]# sed 's#root#tets==#' /etc/passwdtets==:x:0:0:root:/root:/bin/bash
B、打印包含关键字www所在的所有行
[root@test ~]# sed -n '/www/p' /etc/passwdwww:x:500:500::/home/www:/bin/bash
C、删除文本指定行
删除首行:
[root@test ~]# sed '1d' /etc/passwd
删除第二行
[root@test ~]# sed '2d' /etc/passwd
删除最后一行:
[root@test ~]# sed '$d' /etc/passwd
删除2-6行:
[root@test ~]# sed '2,6d' /etc/passwd
删除root所在行:
[root@test ~]# sed '/root/'d /etc/passwd
删除3到末行:
[root@test ~]# sed '3,$d' /etc/passwd
D、增加内容
在1-3行的下行分别插入test字符串
[root@test ~]# sed '1,3a test' /etc/passwdroot:x:0:0:root:/root:/bin/bashtestbin:x:1:1:bin:/bin:/sbin/nologintestdaemon:x:2:2:daemon:/sbin:/sbin/nologintestadm:x:3:4:adm:/var/adm:/sbin/nologin
在第一行后增加多行,使用换行符\n
[root@test ~]# sed '1a hello\n world' /etc/passwdroot:x:0:0:root:/root:/bin/bashhello worldbin:x:1:1:bin:/bin:/sbin/nologin
在匹配字符串下行增加test
[root@test ~]# sed '/netdata/a\test' /etc/passwdnetdata:x:497:498:netdata:/:/sbin/nologintest
E、代替
将第1-2行,用test代替
[root@test ~]# sed '1,2c test' /etc/passwdtest
F、打印指定范围文本内容
打印root和ftp之间的所有行内容
[root@test ~]# sed -n '/root/,/ftp/p' /etc/passwd
打印第五行开始到第一个包含ftp开头的所有行
[root@test ~]# sed -n '5,/^ftp/p' /etc/passwd
G、多点编辑
[root@test ~]# sed -e '1,5d' -e 's/www/qqqqq/' /etc/passwd
-e选项允许在同一行里执行多条命令。第一条命令删除1至5行,第二条命令用qqqqq替换www。命令的执行顺序对结果有影响。如果两个命令都是替换命令,那么第一个替换命令将影响第二个替换命令的结果。
黄油饼是甜的,混着的眼泪是咸的,就像人生,交杂着各种复杂而美好的味道。
——汪曾祺《食事》