1、用法
sed[option]... 'script' inputfile...
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak: 备份文件并原处编辑
script:
'地址命令'
2、地址定界
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#
/pat1/,/pat2/
#,/pat1/
(4) ~:步进
1~2 奇数行
2~2 偶数行
3、编辑命令
d: 删除模式空间匹配的行,并立即启用下一轮循环
p:打印当前模式空间内容,追加到默认输出之后
a []text:在指定行后面追加文本,支持使用\n实现多行追加
i[]text:在行前面插入文本
c []text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
=: 为匹配的模式空间中的行打印行号
!:模式空间中匹配行取反处理
4、查找替换
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
5、sed的高级编辑命令
P:打印模式空间开端至\n内容,并追加到默认输出之前
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本,并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间
6、举例
[root@centos6 app]#seq 11 |sed -n '1~2p' ---打印奇数行
1
3
5
7
9
11
[root@centos6 app]#seq 11 |sed -n '2~2p'
2
4
6
8
10
[root@centos6 app]#seq 5|sed 'axy'
1
xy
2
xy
3
xy
4
xy
5
xy
[root@centos6 app]#seq 5|sed 'a\ xy' ---\加不加都可以,但加上有的时候可以前面多个空格
1
xy
2
xy
3
xy
4
xy
5
xy
[root@centos6 app]#seq 5|sed '2,4axyz'
1
2
xyz
3
xyz
4
xyz
5
[root@centos6 app]#seq 5|sed '2axyz\n====\n++++' ---\n可以追加多行内容
1
2
xyz
====
++++
3
4
5
[root@centos6 ~]#sed '/^# Source/i alias yi="yum install"' .bashrc
# .bashrc
# User specific aliases and functions
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias p='poweroff'
alias cdpack='cd /misc/cd/Packages/'
alias cdnet='cd /etc/sysconfig/network-scripts/'
alias yi="yum install" ---在指定行的前面插入内容
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
[root@centos6 ~]#sed '/^SELINUX=enforcing/cSELINUX=permissive' /etc/selinux/config ---替换
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
[root@centos6 ~]#seq 5|sed '2,4w /app/f1' ---保存模式空间的内容到指定文件
1
2
3
4
5
[root@centos6 ~]#cd /app
[root@centos6 app]#ls
f1 mkdvdiso.sh
[root@centos6 app]#cat f1
2
3
4
[root@centos6 app]#seq 5|sed '3r /etc/issue' ---读取文件中的内容到指定的行后
1
2
3
CentOS release 6.9 (Final)
Kernel \r on an \m
\l
\n
\t
4
5
[root@centos6 app]#sed -e '/^#/d' -e '/^$/d' /etc/fstab ---多点编辑,表示以#开头的行和空行删除
UUID=07e3094b-c50d-4568-aee5-b2f76d91c962 / ext4 defaults 1 1
UUID=4a2031c3-8595-489e-bc6d-1e2c31860c7b /app ext4 defaults 1 2
UUID=a056e3b8-7cc2-4aea-9308-9b0744741394 /boot ext4 defaults 1 2
UUID=953b7594-f906-4d3e-8a3a-a6bb79b1c900 swap swap defaults 0 0
UUID=d027885d-e32b-42e7-94aa-329130282748 /home ext4 usrquota,grpquota 0 0
tmpfs /dev/shm tmpfs defaults 0 0
devpts /dev/pts devpts gid=5,mode=620 0 0
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
[root@centos6 app]#vim sed.txt
1 /^s/d
[root@centos6 app]#cat f2
bbbdddd
sdfgggg
1234445
[root@centos6 app]#sed -f sed.txt f2 ---调用文件中的脚本
bbbdddd
1234445
[root@centos6 app]#sed -n 's/ext4/xfs/p' /etc/fstab --- -p表示只打印匹配成功的行
UUID=07e3094b-c50d-4568-aee5-b2f76d91c962 / xfs defaults 1 1
UUID=4a2031c3-8595-489e-bc6d-1e2c31860c7b /app xfs defaults 1 2
UUID=a056e3b8-7cc2-4aea-9308-9b0744741394 /boot xfs defaults 1 2
UUID=d027885d-e32b-42e7-94aa-329130282748 /home xfs usrquota,grpquota 0 0
[root@centos6 app]#sed -nr 's/(bash)$/\1er/pg' p1---分组和后向引用
root:x:0:0:root:/root:/bin/basher
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/basher
zhang:x:500:500::/home/zhang:/bin/basher
tom:x:504:505::/home/tom:/bin/basher
libai:x:510:510::/home/libai:/bin/basher
dufu:x:512:512::/home/dufu:/bin/basher
zhaoritian:x:514:514::/home/zhaoritian:/bin/basher
gentoo:x:515:501:Gentoo Distribution:/home/gentoo:/bin/basher
natasha:x:516:516::/home/natasha:/bin/basher
harry:x:517:504::/home/harry:/bin/basher
alice:x:518:518::/home/alice:/bin/basher
bash:x:519:520::/home/bash:/bin/basher
testbash:x:520:521::/home/testbash:/bin/basher
sh:x:521:522::/home/sh:/bin/basher
[root@centos6 app]#sed -nr 's/bash$/&er/pg' p1 ---可以用&代替前面匹配的内容
root:x:0:0:root:/root:/bin/basher
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/basher
zhang:x:500:500::/home/zhang:/bin/basher
tom:x:504:505::/home/tom:/bin/basher
libai:x:510:510::/home/libai:/bin/basher
dufu:x:512:512::/home/dufu:/bin/basher
zhaoritian:x:514:514::/home/zhaoritian:/bin/basher
gentoo:x:515:501:Gentoo Distribution:/home/gentoo:/bin/basher
natasha:x:516:516::/home/natasha:/bin/basher
harry:x:517:504::/home/harry:/bin/basher
alice:x:518:518::/home/alice:/bin/basher
bash:x:519:520::/home/bash:/bin/basher
testbash:x:520:521::/home/testbash:/bin/basher
sh:x:521:522::/home/sh:/bin/basher
[root@centos6 app]#ifconfig eth2|sed -n -e '2s/^.*addr://' -e '2s/ .*$//p' ---取出IP地址
192.168.25.179
[root@centos6 app]#ifconfig eth2|sed '2!d;s/^.*addr://;s/ .*$//' ---分号表示可以执行多次操作
192.168.25.179