做用:主要用于替换指定的字符;查找或替换指定字符串时,必须把字符串用//来注释下,好比root 必须是/root/;
sed 只要不用-i参数,通常都是在输出终端上显示而已,没法更改源文件;express
参数-e: --expression,多重编辑;
参数-n:不带-n则列出文件全部内容,加上-n只列出匹配的那一行;
参数-i:直接修改读取的内容文件,而不是输出到终端;
参数-r:可让特殊字符不用加转义符脱义
功能I:忽略查询字符的大小写 ‘/ /’Ip
功能s:替换、取代;
功能g:本行全局替换;
功能d:删除;
功能a:新增;bash
打印指定某行
sed -n 'n'p filename
引号n表明数字,第几行,p为打印意思;
例如只打印第2行ide
[root@jinkai01 sed]# sed -n '2'p passwd
bin:x:1:1:bin:/bin:/sbin/nologincode
打印包含某个字符串的行
sed -n '/root/'p filename
root 表明字符串,将包含root的行打印出来文档
[root@jinkai01 sed]# sed -n '/root/'p passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin字符串
包含特殊字符用法it
#打印以1 为开头的行****io
sed -n '/^1/'p passwd class
#打印以 in 结尾的行test
sed -n '/in$/'p passwd
#打印包含r 和 o 之间有零个或一个的任意字符的行
sed -n '/r.o/'p passwd
#打印包含oo后面有零个或多个o的行
sed -n '/ooo*/'p passwd
#sed命令加上-e选项能够实现多个行为
sed -e '1'p -e '/111/'p -n passwd
打印出第一行和包含111字符的全部行
替换字符或者字符串
参数s就表示替换的动做;
参数g表示本行全局替换,若是不加g则只替换本行出现的第
一个;
指定替换一行或多行内的字符,不加数字就是替换文档所有,$表示结尾,^表示开头;
实验:把passwd文档的第1行和第2行的root换成aaa且打印出来
[root@jinkai01 sed]# sed '1,2s/root/aaa/g' passwd
aaa:x:0:0:aaa:/aaa:/bin/bash
替换文档内的所有数字或字母为空
实验:把passwd 文档内的全部字母替换为空
[root@jinkai01 sed]# sed 's/[a-zA-Z]//g' passwd
::0:0::/://
::1:1::/://
替换字母大小写
sed中,使用\u表示大写,\l表示小写
把文件中每一个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename
把文件中全部字母小写变大写:
*sed 's/[a-z]/\u&/g' filename
sed 's/[A-Z]/\l&/g' filename
d:删除动做。
这里参数d表示删除的动做,它不只能够删除指定的单行以及多行,并且能够删除匹配某个字符的行,还能够删除从某一行开始到文档最后一行的全部行。
这个删除操做仅仅是显示在屏幕上,原文档并无影响。
实验:删除passwd内包含root的行
[root@jinkai01 sed]# sed '/root/'d passwd
实验:删除passwd 文档的第1行
[root@jinkai01 sed]# sed '1'd passwd
实验:删除passwd 文档的第1行到第3行
[root@jinkai01 sed]# sed '1,3'd passwd
调换两个字符串的位置
-r 参数:能够不用加转义符\ 去脱义特殊字符
实验:把passwd文档内的root 和bin调换位置
[root@jinkai01 sed]# sed -r 's/(root)(.*)(bin)/\3\2\1/' passwd
实验:把passwd文档内的第一列和最后一列作调换
[root@jinkai01 sed]# sed -r 's/([^:]+):(.*):([^:]+)/\3:\2:\1/' passwd
/bin/bash:x:0:0:root:/root:root
/sbin/nologin:x:1:1:bin:/bin:bin
/sbin/nologin:x:2:2:daemon:/sbin:daemon
实验:在某一行先后增长指定内容
在每一行最后面加上:aaa
sed -r 's/([^:]+$)/\1:aaa/' passwd
或sed -r 's/(.*)/\1:aaa/' passwd
在每一行最前面加上aaa:
sed -r 's/(.*)/aaa:\1/' passwd
或sed -r 's/([^:]+)/aaa:\1/' passwd
将passwd 文档里面的ot 所有替换为 to,不打印到屏幕,真实改变文件自己
[root@jinkai01 sed]# sed -i 's/ot/to/g' passwd
[root@jinkai01 sed]# head -3 passwd
roto:x:0:0:roto:/roto:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
课后习题
(1) 把/etc/passwd复制到/root/test.txt,用sed打印全部行。
sed -n '1,$'p test.txt
(2) 打印test.txt的第3行~第10行。
sed -n '3,10'p test.txt
(3) 打印test.txt中包含root的行。
sed -n '/root/'p test.txt
(4) 删除test.txt的第15行以及后面的全部行。
sed '15,$'d test.txt
(5) 删除test.txt中包含bash的行。
sed '/bash/'d test.txt
(6) 将test.txt中的root替换为toor。
sed 's/root/toor/g'p test.txt
(7) 将test.txt中的/sbin/nologin替换为/bin/login。
sed 's#sbin/nologin#bin/login#g'p test.txt
(8) 删除test.txt中第5行~第10行中全部的数字。
sed '5,10s/[0-9]//g'p test.txt
(9) 删除test.txt中全部的特殊字符(除了数字以及大小写字母)。
sed 's/[^0-9a-zA-Z]//g'p test.txt
(10) 把test.txt中第一个单词和最后一个单词调换位置。
sed -nr 's/([a-zA-Z]+)([^a-zA-Z].*[^a-zA-Z])([a-zA-Z]+)/\3\2\1/'p test.txt
(11) 把test.txt中出现的第一组数字(1个或多个)和最后一个单词调换位置。
sed -nr 's/(^[^0-9])([0-9]+)([^0-9].*[^a-zA-Z])([a-zA-Z]+$)/\1\4\3\2/g'p test.txt
或者sed -nr 's/([0-9]+)([^0-9].*[^a-zA-Z])([a-zA-Z]+)/\3\2\1/'p
(12) 把test.txt中第一个数字移动到本行末尾。
sed -nr 's/(^[^0-9] )([0-9]+)([^0-9].*$)/\1\3\2/'p test.txt 一组数字
或sed -nr 's/([0-9])(.)([^0-9].*$)/\3\2\1/'p 单个数字
(13) 在test.txt第20行到最后一行最前面加aaa:。
sed '20,$s/^.*$/aaa:&/'p test.txt