sed是一种支持正则表达式的非交互式流编工具(stream editor)
脚本中修改文本或者文本替换的最佳工具
sed是一行一行处理
一、sed的语法命令格式

二、sed的常用选项

在编写脚本中,-i选项是最常用的
注意:-i是在原文件进行操作,可以cp一份到/lianxi下
常用选项案例:
#显示第一行
[root@localhost lianxi]# sed -n '1p' /etc/passwd
#显示第一行至第十行
[root@localhost lianxi]# sed -n '1,10p' /etc/passwd
#显示第一行和第十行
[root@localhost lianxi]# sed -n '1p;10p' /etc/passwd
#显示从第一行开始步长为3的行
[root@localhost lianxi]# sed -n '1~3p' /etc/passwd
#显示从第一行开始打印三行
[root@localhost lianxi]# sed -n '1,~3p' /etc/passwd
#显示第一行和后面三行
[root@localhost lianxi]# sed -n '1,+3p' /etc/passwd三、sed常用编辑命令

常用编辑命令案例:
#输出以#开头的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n '/^#/p'
#输出不以#开头的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n '/^#/!p'
#输出不以#开头的行和[0-9]开头的行
[root@localhost lianxi]# cat /etc/ssh/ssh_config |sed -n -r '/^#|^[0-9]/!p'
#将/etc/passwd文件里以bai开头的替换成tang
[root@localhost lianxi]# sed -i 's/^bai/tang/' /etc/passwd
#将/etc/passwd文件里第一行替换成good
[root@localhost lianxi]# sed -i '1c good' /etc/passwd
#在第四行后面追加huawei
[root@localhost lianxi]# sed -i '4a huawei' test.txt
#在第四行前面追加huawei
[root@localhost lianxi]# sed -i '4i huawei' test.txt三、shell变量传到sed
推荐使用双引号
[root@localhost lianxi]# a=1
[root@localhost lianxi]# b=10
[root@localhost lianxi]# sed -n "${a},${b}p" passwd
good
bin::1:1:bin:/bin:/sbin/nologin
daemon::2:2:daemon:/sbin:/sbin/nologin
adm::3:4:adm:/var/adm:/sbin/nologin
lp::4:7:lp:/var/spool/lpd:/sbin/nologin
sync::5:0:sync:/sbin:/bin/sync
shutdown::6:0:shutdown:/sbin:/sbin/shutdown
halt::7:0:halt:/sbin:/sbin/halt
mail::8:12:mail:/var/spool/mail:/sbin/nologin
operator::11:0:operator:/root:/sbin/nologin
[root@localhost lianxi]#
四、练习
1.sed取出/etc/passwd文件的第一列
[root@localhost lianxi]# sed -n 's/:.*//p' passwd
####或者
[root@localhost lianxi]# sed -n 's/:/\n/p' passwd|sed -n '1~2p'2.sed将PATH环境变量中的冒号换成换行 ->可以将PATH变量的内容重定向到一个文件里,例如path.txt
[root@localhost lianxi]# sed -n 's/:/\n/gp' path.txt3.将/etc/sysconfig/network-scripts/ifcfg-ens33里的ONBOOT=no修改为yes或者修改下IPADDR后面的ip地址,具体ip自己定义
[root@localhost lianxi]# sed -i '/ONBOOT=/ s/no/yes/' ifcfg-ens334.只显示ip add的ip地址
[root@localhost lianxi]# sed -i '3~6 s/\//\n/' ippp.txt
[root@localhost lianxi]# sed -i '3~7 s/inet//' ippp.txt五、模式空间(pattern space)和缓存空间(hold space)
n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
! 对所选行以外的所有行应用命令。
例题:

#1:
[root@localhost lianxi]# cp /etc/hosts .
[root@localhost lianxi]# sed -i 's/^/sanchuang/' hosts
#2:
[root@localhost lianxi]# vim test.txt
[root@localhost lianxi]# sed 'N;N; s/\n/:80,/g; s/$/:80/' test.txt例如有一个文件,我们可以用tac命令反序打印出文件的内容,其实用sed的话也可以实现,这里先将结果列出,再详细讲解
详解网址:sed高级用法:模式空间(pattern space)和保持空间(hold space)_ITsenlin的专栏-CSDN博客
[root@localhost lianxi]# sed '1!G;h;$!d' file六、sed命令中&的用法

例题:
给下列含有大写字母的行,在大写字母后追加数字2020 --》sed
abcdSdddde
islHishbxld
goBkefji
daanshXxge
[root@localhost lianxi]# vim upper.txt
[root@localhost lianxi]# sed -rn 's/[A-Z]/&2020/gp' upper.txt版权声明:本文为yiqinshang原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。

