Stream Editor (sed)被称为流编辑器
stream editor
一次只读一行,只处理一行,不对源文件做处理,至输出到屏幕上
模式空间
是一个行编辑器
sed命令:
sed [options] "script" FILE....
选项
-n:静默模式,不输出模式空间中的内容
-r:扩展的正则表达式
-f /path/to/sed_script_file: 指定sed脚本文件
-e 'script -e 'script' :指定多个编译
script = 地址定界 + 编辑命令
编辑命令:script
d:删除
p:打印 一般信息会显示两边
i \text:在行之上添加
a \text:在
r /path/to/somefile:在指定位置把另一个文件的内容插入进来
r /path/to/somefile:将符合条件的所有行保存至指定的文件中
= :显示符合条件的行的行号
s///: 查找条件可以使用模式,但是替换的内容不行
地址定界:
startline,endline
1,3
/part1/,/part2/
/pattren/
用法:sed [option] 'addr1[,addr2]定界编辑命令' FILE....
用法:sed [option] "addr1[,addr2]定界编辑命令" FILE.... 有命令替换时必须使用""号
正则表达式:
基本:
字符:
.
[]
[^]
次数:
*
\?
\{m,n\}
锚定
^
$
\< \b
\> \b
分组:
\(\)
应用
\1 \2..
扩展:
字符
.
[]
[^]
[[:lower:]] [[:punct:]] [[:alnum:]]
次数:
*
?
+
{m,n}
锚定:
^
$
\> \b
\< \b
或
a | b
分组
()
引用:
\1,\2,.....
sed ‘地址定界s@查找条件@替换文本@g’
修饰符:
g:global 全局替换
i:ignore-case 不区分字符的大小写
sed高级用法:t, T, D ,P, N, n,H, h, G,g
例子 : 地址定界+d
原文件
[root@localhost ~]# cat /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Sep 1 04:47:41 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 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
/dev/myvg1/mylv1 /users ext4 defaults 0 0
删除1到3行
[root@localhost ~]# sed '1,3d' /etc/fstab
# Created by anaconda on Sat Sep 1 04:47:41 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 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
/dev/myvg1/mylv1 /users ext4 defaults 0 0
[root@localhost ~]#
删除以 “#”开头的行
[root@localhost ~]# sed '/^#/d' /etc/fstab
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 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
/dev/myvg1/mylv1 /users ext4 defaults 0 0
[root@localhost ~]#
删除已“ \ ”开头的行
[root@localhost ~]# sed '/^\//d' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Sep 1 04:47:41 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 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@localhost ~]#
删除第6行 到第一次已“/”结尾的行
sed '6,/^\//d' /etc/fstab
删除第一次已“#”开头的行到第一次已“/”开头的行
sed '/^#/,/^\//d' /etc/fstab
例子 : 地址定界+a/i
在以“/”为首的行之上添加一行hello
[root@localhost ~]# sed '/^\//i \hello' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Sep 1 04:47:41 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 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
hello
/dev/myvg1/mylv1 /users ext4 defaults 0 0
在以大写字母开头的行之下添加行“first line”在换行添加“second line”
[root@localhost ~]# sed '/^[[:upper:]]/a \first line. \nsecond line' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Sep 1 04:47:41 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
first line.
second line
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
first line.
second line
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 0 0
first line.
second line
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
/dev/myvg1/mylv1 /users ext4 defaults 0 0
[root@localhost ~]#
例子 : 地址定界+r
在以UUID开头的行之后添加文件/etc/issue
[root@localhost ~]# sed '/^UUID/r /etc/issue' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Sep 1 04:47:41 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
CentOS release 6.5 (Final)
Kernel \r on an \m
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
CentOS release 6.5 (Final)
Kernel \r on an \m
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 0 0
CentOS release 6.5 (Final)
Kernel \r on an \m
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
/dev/myvg1/mylv1 /users ext4 defaults 0 0
[root@localhost ~]#
例子 : 地址定界+w
将以‘/’开头的行保存至文/etc/filetable.txt中
[root@localhost ~]# sed '/^\//w /etc/filetable.txt' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Sat Sep 1 04:47:41 2018
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 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
/dev/myvg1/mylv1 /users ext4 defaults 0 0
[root@localhost ~]# cat /etc/filetable.txt
/dev/myvg1/mylv1 /users ext4 defaults 0 0
[root@localhost ~]#
将以‘/’开头的行的行号显示出来
[root@localhost ~]# sed -n '/^\//=' /etc/fstab
16
[root@localhost ~]#
同时2个操作
先把开头的#删除,再删除空白行
[root@localhost ~]# cat sed.txx
s@^#@@g
/^$/d
[root@localhost ~]# sed -f sed.txx /etc/fstab
/etc/fstab
Created by anaconda on Sat Sep 1 04:47:41 2018
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 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
/dev/myvg1/mylv1 /users ext4 defaults 0 0
[root@localhost ~]#
方法2:使用-e
[root@localhost ~]# sed -e "s@^#@@g" -e "/^$/d" /etc/fstab
/etc/fstab
Created by anaconda on Sat Sep 1 04:47:41 2018
Accessible filesystems, by reference, are maintained under '/dev/disk'
See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
UUID=0144d9ef-fde1-4a1b-8209-391df9cc1f66 / ext4 defaults 1 1
UUID=4170f3c7-06df-45c7-bd0f-2c296e52587f /boot ext4 defaults 1 2
UUID=be91a07c-f924-4998-b60e-0ae55a68346b swap swap defaults 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
/dev/myvg1/mylv1 /users ext4 defaults 0 0
[root@localhost ~]#
He like his liker
He like his lover
She love her liker
She love her lover
1.删除以前内容中含“l..e”前后一致的行
sed "/\(l..e\).*\1r/d" 1.txt
2.将文件中“l..e”前后一致的行中,最后一个l..e的词首的l换成大写L
[root@localhost ~]# sed "/\(l..e\).*\1r/ s@l\(..er\)@L\1@g" 1.txt
He like his Liker
He like his lover
She love her liker
She love her Lover
练习:
1)替换/etc/inittab文件中”id:3:initdefault:”一行中的数字为5
sed 's@\(id:\)[0-9]\(:initdefault\)@\15\2' /etc/inittab
2)删除/etc/init.d/funcions文件中的空白行
sed "/^$/d" /etc/init.d/funcions
3)删除/etc/inittab文件中位于行首的#;
sed 's@^#@@g' /etc/inittab
4)删除/etc/rc.d/rc.sysinit文件中以#后跟至少一个空白字符开头的行的行首的#和空白字符。
sed "s@^#[[:space:]]\{1,\}\@@g" /etc/rc.d/rc.sysinit
5)删除/boot/grub/grub.conf文件中行首的空白字符。
sed "s@^[[:space:]]\{1,\}@@g" /boot/grub/grub.conf
6)取出一个文件路径的目录名称,如/etc/sysconfig/network,其目录为/etc/sysconfig,功能类似dirname命令;
echo /etc/sysconfig/network | sed "s@[^/]\{1,\}/\?$@@"