语法 sed '范围(条件) 命令' file
d: 删除
范围: 使用数字 表示多少行, 可以使用逗号表示到。 ~表示跨步
$ 表示最后一行
[root@hadoop000 ~]# cat -n /etc/passwd | sed '10.35d’
正则表达式: // 引起来
[root@hadoop000 ~]# cat aa
to
tom aaa bbbtomaaa
111 tom aaaTom cccc
aaaatomaaaaaa
aaaaaaaaaaaaaaaaaatom
[root@hadoop000 ~]# sed '/tom/d' aa ##删除tom行
to
[root@hadoop000 ~]# sed '/^tom/,/tom$/d' aa ##删除tom行
to
[root@hadoop000 ~]# sed '/\btom\b/d' aa ###删除tom单词行
to
aaaatomaaaaaa
aaaaaaaaaaaaaaaaaatom
s : 替换 s/old/new/标签 意思是把old换成new
old是可以使用正则的,但是new的位置不能使用正则
& 表示old的值
\U 把\U后面所有的字符全部转变为大写
\u 把\u后面第一个字符变成大写
\L 把后面所有的字符变成小写
\l 把后面第一个字符变成小写
\E 代表是终止
[root@hadoop000 ~]# sed 's/tom/TOM/' aa ###这样只替换每行的第一个tom
to
TOM aaa bbbtomaaa
111 TOM aaaTom cccc
aaaaTOMaaaaaa
aaaaaaaaaaaaaaaaaaTOM
[root@hadoop000 ~]# sed 's/tom/TOM/g' aa ###加上标签g 把第一个tom也替换掉了
to
TOM aaa bbbTOMaaa
111 TOM aaaTom cccc
aaaaTOMaaaaaa
aaaaaaaaaaaaaaaaaaTOM
[root@hadoop000 ~]# sed 's/[tT][Oo]m/TOM/g' aa ###不管是大小写t与大小写o都替换
to
TOM aaa bbbTOMaaa
111 TOM aaaTOM cccc
aaaaTOMaaaaaa
aaaaaaaaaaaaaaaaaaTOM
[root@hadoop000 ~]# cat bb
TOM TOM TOM AAA AAA AAA
aaa
[root@hadoop000 ~]# sed '1{s/tom/TOM/g; s/aaa/AAA/g}' bb ###指定第一行替换多个
TOM TOM TOM AAA AAA AAA
aaa
[root@hadoop000 ~]# sed 's/tom/--&--/g' aa ##这里的&相当于old
to
--tom-- aaa bbb--tom--aaa
111 --tom-- aaaTom cccc
aaaa--tom--aaaaaa
aaaaaaaaaaaaaaaaaa--tom--
[root@hadoop000 ~]# cat aa
to
tom aaa bbbtomaaa
111 tom aaaTom cccc
aaaatomaaaaaa
aaaaaaaaaaaaaaaaaatom
[root@hadoop000 ~]# sed 's/tom/yyy\Uyyy/g' aa \U 把\U后面所有的字符全部转变为大写
to
yyyYYY aaa bbbyyyYYYaaa
111 yyyYYY aaaTom cccc
aaaayyyYYYaaaaaa
aaaaaaaaaaaaaaaaaayyyYYY
[root@hadoop000 ~]# sed 's/tom/y\uyyy/g' aa \u 把\u后面第一个字符变成大写
to
yYyy aaa bbbyYyyaaa
111 yYyy aaaTom cccc
aaaayYyyaaaaaa
aaaaaaaaaaaaaaaaaayYyy
[root@hadoop000 ~]# sed 's/tom/T\LTTTT/g' aa \L 把后面所以的字符变成小写
to
Ttttt aaa bbbTttttaaa
111 Ttttt aaaTom cccc
aaaaTttttaaaaaa
aaaaaaaaaaaaaaaaaaTtttt
[root@hadoop000 ~]# more aa
to
tom aaa bbbtomaaa
111 tom aaaTom cccc
aaaatomaaaaaa
aaaaaaaaaaaaaaaaaatom
[root@hadoop000 ~]# sed 's/tom/T\lTTTT/g' aa \l 把后面第一个字符变成小写
to
TtTTT aaa bbbTtTTTaaa
111 TtTTT aaaTom cccc
aaaaTtTTTaaaaaa
aaaaaaaaaaaaaaaaaaTtTTT
[root@hadoop000 ~]# more smb.conf 要求把[]里面小心的字符换成大小的
[public]
public = yes
[liyong]
writable = yes
[root@hadoop000 ~]# sed 's/\[.*]/\U&/' smb.conf
[PUBLIC]
public = yes
[LIYONG]
writable = yes
[root@hadoop000 ~]# sed 's/tom/yyy\Uyyy\Ey/g' aa \E 代表是终止
to
yyyYYYy aaa bbbyyyYYYyaaa
111 yyyYYYy aaaTom cccc
aaaayyyYYYyaaaaaa
aaaaaaaaaaaaaaaaaayyyYYYy
分组(group) : 在old部分相关位置使用()扩起来,在new可以引用。第一括号使用\1 \2
[root@hadoop000 conf]# sed -n 's/#\(ServerName\)/\1/p' /etc/httpd/conf/httpd.conf
ServerNamewww.example.com:80
[root@hadoop000 conf]# sed -n 's/#\(Server\)\(Name\)/\2/p' /etc/httpd/conf/httpd.conf
a : 在指定行的下一行添加一行
i : 在指定行的上一行添加
c : 替换 ---> 把满足某个条件的行替换
y : 替换
注意: 如果想使用sed修改源文件的话,那么不要使用-n选项和p标签
[root@hadoop000 ~]# cat ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.192.251
NETMASK=255.255.255.0
GATEWAY=192.168.192.2
[root@hadoop000 ~]# sed '2a DNS1=192.168.30.1' ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
DNS1=192.168.30.1
ONBOOT=yes
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.192.251
NETMASK=255.255.255.0
GATEWAY=192.168.192.2
[root@hadoop000 ~]# sed '/^ONBOOT/c ONBOOT=no' ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
ONBOOT=no
NM_CONTROLLED=yes
BOOTPROTO=none
IPADDR=192.168.192.251
NETMASK=255.255.255.0
GATEWAY=192.168.192.2
[root@hadoop000 ~]# sed '2y/abc/XYZ/' aa
to
tom XXX YYYtomXXX
111 tom aaaTom cccc
aaaatomaaaaaa
aaaaaaaaaaaaaaaaaatom
#######sed 老段下######
记住: 我们所做的所以的操作,并没有改变源文件
=
n 读取下一行
N 追加 也是读取下一行
#n 读取下一行之后,会覆盖模式空间的内容
[root@hadoop000 ~]# sed -n '1{n;p}' ifcfg-eth0
TYPE=Ethernet
[root@hadoop000 ~]# sed -n '1{N;p}' ifcfg-eth0
DEVICE=eth0
TYPE=Ethernet
保持空间
x: 让 保持空间和模式空间的数据互换
h: 把模式空间的内容拷贝到保持空间(覆盖)
H: 把模式空间的内容拷贝保持空间(追加)
g: 把保持空间的内容写入到模式空间(覆盖)
G: 把保持空间的内容写入到模式空间(追加)
使用sed标签功能,可以让我们实现循环
语法:
sed ':标签 范围1 命令1; /模式/b 标签名' file
[root@hadoop000 ~]# more dd
rhce aaa rhce rhce
rhce aaa rhce rhce
rhce aaa rhce rhce
rhce aaa rhce rhce
rhce aaa rhce rhce
[root@hadoop000 ~]# sed ':XX s/rhce/RHCE/; /rhce/b XX' dd
RHCE aaa RHCE RHCE
RHCE aaa RHCE RHCE
RHCE aaa RHCE RHCE
RHCE aaa RHCE RHCE
RHCE aaa RHCE RHCE
[root@hadoop000 ~]# more cc
tom
jingli
bob
zongjian
mary
jingli
jerry
zongjian
[root@hadoop000 ~]# sed -n -e 'x;n' -e '/jingli/{x;p}' cc
tom
mary
[root@hadoop000 ~]# sed -n -e '/jingli/!h' -e '/jingli/{x;p}' cc
tom
mary
[root@hadoop000 ~]# sed -n -e '/jingli/!h' -e '/jingli/{H;x;p}' cc
tom
jingli
mary
jingli
[root@hadoop000 ~]# sed -n -e '/jingli/!h' -e '/jingli/{H;x;s/\n/:/;p}' cc
tom:jingli
mary:jingli
要求:职位和用户互换位置
[root@hadoop000 ~]# more cc
tom
jingli
bob
zongjian
mary
jingli
jerry
zongjian
[root@hadoop000 ~]# sed -n 'h;n;G;s/\n/:/;p' cc ## G: 把保持空间的内容写入到模式空间(追加)
jingli:tom
zongjian:bob
jingli:mary
zongjian:jerry
要求:想把所有的用户名全部打印出来
[root@hadoop000 ~]# more cc
tom
jingli
bob
zongjian
mary
jingli
jerry
zongjian
[root@hadoop000 ~]# sed -n 'h;n;g;p' cc
tom
bob
mary
jerry
例题: sed打印基数行 与偶数行
[root@hadoop000 ~]# seq 10 |sed 'n;d' ###n 读取下一行 d 删除
1
3
5
7
9
[root@hadoop000 ~]# seq 10 |sed -n '1~2p'
1
3
5
7
9
[root@hadoop000 ~]# seq 10 |sed -n 'p;n'
1
3
5
7
9
[root@hadoop000 ~]# seq 10 |sed '2~2d'
1
3
5
7
9
[root@hadoop000 ~]# seq 10 |sed 'p;N;d'
1
3
5
7
9
[root@hadoop000 ~]# seq 10 |sed 'N;s/\n/ /'
1 2
3 4
5 6
7 8
9 10
例题: sed打印 偶数行