sed命令是一个非交互式的文本编辑器,是将一系列的编辑命令应用于一批文本的理想工具,可以对来自文本文件以及标准输入的文本进行编辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者是管道的文本
sed命令拥有非交互式和高效的特点,可以为用户节约大量的时间
Vim 采用的是交互式文本编辑模式,可以用键盘命令来交互性地插入、删除或替换数据中的文本。但 sed命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据
sed -参数 '[定址符]' '操作' 文件名
地址定界 | 作用 |
---|---|
1,5 | 对文件的1-5行内容进行处理 |
2,$ | 对文件的2到最后一行内容进行处理 |
1,+3 | 对文件第1行以及以后的3行内容进行处理 |
1~2 | 对文件的1,3,5,7,……的行内容进行处理 |
/正则表达式/ | 对任何能够被正则表达式匹配到的行进行处理 |
s:替换,替换指定字符,一般搭配正则表达式
d:删除,删除选定的行。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。
=:打印行号。
a:增加(append),a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
i:插入(insert),i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
c:行替换,指定行中的所有内容,替换成该选项后面的字符串。
y:字符转换,转换前后的字符长度必须相同。
l(小写):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
! :对指定行以外的所有行应用命令
& :代表匹配到的内容
[root@server ~]# vim sed1.txt
one
two
three
four
five
six
seven
eight
nine
ten
[root@server ~]# sed -n 'p' sed1.txt # 全文打印
[root@server ~]# sed -n '=;p' sed1.txt # 全文打印并显示行号,分号分割动作
[root@server ~]# sed -n -e '=' -e 'p' sed1.txt # 同上
[root@server ~]# sed -n 'l' sed1.txt # 全文显示并输出控制字符
[root@server ~]# sed -n ' # 全文打印,交互模式
> =
> p
> ' sed1.txt
[root@server ~]# sed -n '1p' sed1.txt # 打印第一行
[root@server ~]# sed -n '4,6p' sed1.txt # 打印4-6行
[root@server ~]# sed -n '3,12p' sed1.txt # 打印3-12行,超行范围只显示实际内容
[root@server ~]# sed -n '7,$p' sed1.txt # 打印7到最后一行
[root@server ~]# sed -n '$p' sed1.txt # 打印最后一行
[root@server ~]# sed -n '2~2p' sed1.txt # 打印偶数行
[root@server ~]# sed -n '1~2p' sed1.txt # 打印奇数行
[root@server ~]# sed -n '4p;6p;8p' sed1.txt # 打印4、6、8行
[root@server ~]# sed -n '1,+5p' sed1.txt # 打印第1行及其后5行
[root@server ~]# sed -n '1!p' sed1.txt # 打印除了第1行的剩余行
[root@server ~]# sed -n '2,3!p' sed1.txt # 打印除了2-3行的剩余行
[root@server ~]# sed -n '1~2!p' sed1.txt #打印偶数行
[root@server ~]# sed -n '/^f/p' sed1.txt # 打印f开头的行
[root@server ~]# sed -n '/t/p' sed1.txt # 检索包含t的行
[root@server ~]# sed -n '/^t/p ; /^f/p' sed1.txt # 检索包含t或者包含f行信息
[root@server ~]# sed -n '2,/five/p' sed1.txt # 检索第2行到five所在行
[root@server ~]# sed -n '/n$/p' sed1.txt # 检索n结尾的行信息
[root@server ~]# sed -n 'n;p' sed1.txt # 检索偶数行
[root@server ~]# sed -n 'p;n' sed1.txt # 检索奇数行
[root@server ~]# sed -n '$=' sed1.txt # 打印文本的总行数
[root@server ~]# cp /etc/passwd ~/ps
[root@server ~]# cat ps
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
……
……
sed -参数 '行范围s/旧字符串/新字符串/替换标记' 文件名
[root@server ~]# sed -n 's/root/boot/gp' ~/ps # 全文替换包含root为boot,
[root@server ~]# sed 's/root/boot/g' ~/ps # 不加-n及动作p会显示未变化的和变化的行信息
[root@server ~]# sed -n 's/root/admin/2p' ~/ps # 将每一行第二次出现的root替换为admin
[root@server ~]# sed -n 's/root/admin/p' ~/ps # 将每一行第一个root替换为admin
[root@server ~]# sed -n '4s/adm/root/gp' ~/ps # 将第4行的adm全文替换为root
# 注意:替换的内容及新字符串中有路径分隔符,为了与sed的斜杠分隔符区分开来,需要对路径分隔符/之前增加转义符
[root@server ~]# sed -n 's/\/sbin\/nologin/\/bin\/bash/gp' ~/ps
# 注意:若替换内容及新内容中有路径/符号,可以将sed自带的三个/更换成#
[root@server ~]# sed -n 's#/sbin/nologin#/bin/bash#gp' ~/ps
# 注意:由于上例,则sed自带三个/可以更换成#
[root@server ~]# sed -n 's#root#boot#gp' ~/ps
# 注意:若替换内容就是#时,sed自带三个/不能更换为#,下例报错
[root@server ~]# sed -n 's###@#gp' /etc/sos/sos.conf
[root@server ~]# sed -n '$s/:/@/gp' ~/ps # 将最后一行的所有:替换为@
[root@server ~]# sed 's/^/#/' ~/ps # 全文增加注释
# 查找结果中部分内容插入新内容
[root@server ~]# sed 's/SSH/&@/' ~/ps # 在SSH右侧插入@
[root@server ~]# sed 's/SSH/@&/' ~/ps # 在SSH左侧插入@
# 所有的行首及行尾添加@
[root@server ~]# sed 's/^/@&/g ; s/&$/@/g' ~/ps
[root@server ~]# sed 's/^/@/g ; s/$/@/g' ~/ps
# 文本第一行之前插入空白行
[root@server ~]# sed '1s/^/\n/' ~/ps
# 最后一行插如空白行
[root@server ~]# sed '$s/$/\n/' ~/ps
# 全文所有小写字母改为大写字母,\u表示大写字母不能写[A-Z]
[root@server ~]# sed 's/[a-z]/\u&/g' ~/ps
# 全文所有大写字母改为小写字母,\L为小写字母
[root@server ~]# sed 's/[A-Z]/\L&/g' ~/ps
# 单词首字母大写,\b确定单词边界即第一个字母
[root@server ~]# sed 's/\b[a-z]/\u&/g' ~/ps
# 开启或关闭selinux
[root@server ~]# sed -i 's/SELINUX=disabled/SELINUX=enforcing/' /etc/selinux/config
# 或者
[root@server ~]# sed -i '22s/disabled/enforcing/' /etc/selinux/config
# httpd网页目录替换
[root@server ~]# yum install httpd -y
#xftp上传网页数据
[root@server ~]# sed -i -e '124s/\/var\/www\/html/\/zy/' -e '129s/\/var\/www/\/zy/' /etc/httpd/conf/httpd.conf
[root@server ~]# systemctl start httpd
# 浏览器测试
# 修改bind
[root@server ~]# sed -i -e 's/127.0.0.1/any/p' -e 's/localhost/any/' /etc/named.conf
# 支持管道符即输出重定向
[root@server ~]# echo "china" | sed 's/[a-z]/\u&/g'
CHINA
[root@server ~]# echo "china" | sed 's/[a-z]/\u&/g' > t1.txt
[root@server ~]# cat t1.txt
CHINA
[root@server ~]# sed -n 's/root//gp' ~/ps # 将全文root删除
# 删除全文注释
[root@server ~]# sed -n 's/^#//p' /etc/sos/sos.conf
[root@server ~]# sed -n 's/^.//p' ~/ps # 删除每一行第一个字符,^.表示第一个字符
[root@server ~]# sed -n 's/.$//p' ~/ps # 删除每行最后一个字符
[root@server ~]# sed -n '5,10s/[0-9]//gp' ~/ps # 删除第5-10的所有的数字
# 删除所有特殊字符(除了数字、字母)另存为到文件t1.txt
[root@server ~]# sed 's/[^(a-z)(A-Z)(0-9)]//gw t1.txt' ~/ps # [^]表示不包含
# 会清空文件
[root@server ~]# sed -i 'd' ps
[root@server ~]# cat ps
# 准备示例文件
[root@server ~]# cp /etc/sos/sos.conf ~/sos.conf
[root@server ~]# sed '1d' sos.conf # 删除第1行
[root@server ~]# line_number=2
[root@server ~]# sed "${line_number}d" sos.conf # 变量作为行号,需要使用双引号
[root@server ~]# sed '/^$/d' sos.conf # 删除全文的空白行
[root@server ~]# sed '/Options/d' sos.conf # 删除Options的所在行
# 多个删除条件的写法:
[root@server ~]# sed -e '/Options/d' -e '/options/d' sos.conf
[root@server ~]# sed '/Options/d ; /options/d' sos.conf
[root@server ~]# sed -e '/Options/d' sos.conf | sed '/options/d' sos.conf
[root@server ~]# sed '/3/,/5/d' sos.conf # 删除包含3到包含5的所有行
[root@server ~]# sed '/^\[/d' sos.conf # 删除[开头的行,需要转义
[root@server ~]# sed '/^#/d' sos.conf # 删除注释行,但是为整行删除
# 注意:删除时先不要加-i写回源文件,否则无法恢复
sed '行范围a(或i)\新文本' 文件名
[root@server ~]# sed -i '$a\192.168.48.130 www.openlab.com' /etc/hosts
[root@server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.48.130 www.openlab.com
[root@server ~]# sed -i '3i\192.168.48.131 www.openlab.com' /etc/hosts
[root@server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.48.131 www.openlab.com
192.168.48.130 www.openlab.com
[root@server ~]# sed -i '/131/i\192.168.48.132 www.openlab.com' /etc/hosts
[root@server ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.48.132 www.openlab.com
192.168.48.131 www.openlab.com
192.168.48.130 www.openlab.com
[root@server ~]# touch t2.txt
[root@server ~]# cat t2.txt
[root@server ~]# sed -i '$a\xiaoming 18 98.5' t2.txt
[root@server ~]# cat t2.txt
[root@server ~]# cat t2.txt
[root@server ~]# sed -i '1i\xiaoming 18 98.5' t2.txt
[root@server ~]# cat t2.txt
示例:把/etc/passwd 复制到/root/test.txt,用sed打印所有行;
1、打印test.txt的3到10行;
2、打印test.txt 中包含’root’的行;
3、删除test.txt 的15行以及以后所有行;
4、删除test.txt中包含’bash’的行;
5、替换test.txt 中’root’为’toor’;
6、替换test.txt中’/sbin/nologin’为’/bin/login’
7、删除test.txt中5到10行中所有的数字;
8、删除test.txt 中所有特殊字符(除了数字以及大小写字母);
9、在test.txt 20行到末行最前面加’aaa:’
10、在test.txt所有行首增加#注释
# 打印4-8行
# 打印第3行及其下2行
# 打印中包含null的行
# 打印第5行到sshd所在行的内容
# 将全文的替换adm替换为admin
# 将全文的/bin/bash替换为/usr/bin/sh
# 将1-5行的单词第一个字母大写
# 在第5行之前插入一个空白行
# 安装bind,将/etc/named.conf的2项参数替换为any
# 删除所有的冒号
# 在最后一行之后添加一个空白行
# 删除root所在行
# 在第一行之前插入一条信息记录,内容自定