sed流编辑器

一、sed简介

sed是一种流编辑器,处理时,把当前处理的行存储在临时缓冲区中,称为模式空间,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容没有改变。

二、sed的语法

bash 复制代码
sed OPTIONS... [SCRIPT] [INPUTFILE...]

-n : 输出经过处理的行

-i : 直接编辑原文件,而不是有屏幕输出,默认对原文件不进行操作

-e : 使用多个子命令

-r : 使用扩展正则表达式

-f : 直接将sed的动作写在一个文件内,-f filename 则可以执行filename内的sed动作。

三、模式空间中的编辑操作

1、地址定界

bash 复制代码
[root@long file]# head -n 5 /etc/passwd  > testfile
[root@long file]# cat testfile
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
[root@long file]#
[root@long file]#
[root@long file]# sed 's/:/@@@/g' testfile     # 替换文件中所有:为@@@
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
[root@long file]#
[root@long file]# sed '1,3s/:/@@@/g' testfile   # 替换1-3行
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
[root@long file]# sed -e '1s/:/@/g' -e '3s/:/@/g' testfile         # 替换1行和3行的
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
[root@long file]# sed '2,+2s/:/@/g' testfile           # 替换2行及其后两行
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
[root@long file]# sed '2~2s/:/@/g' testfile          # 每隔1行替换
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
[root@long file]#
​
[root@long file]# sed '/SBIN/Is/:/@/g' testfile   # 带sbin字符忽略大小写的行替换
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
[root@long file]# sed '/daemon/,/lp/s/:/@/g' testfile   # daemon和lp字符之间的行替换
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
[root@long file]# sed -e '1,/admin/s/:/@@/g' testfile    # 第一行到adm之间的
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
[root@long file]# sed -e   '/adm/,$s/:/@@/g' testfile   # adm到最后一行的
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
[root@long file]# sed -e   '\%adm%,$s%:%@@%g' testfile     # 其他sed分隔符的指定
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

2、常用编辑命令

bash 复制代码
[root@long file]# head -n 5 /etc/passwd  > testfile
[root@long file]# cat testfile
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
[root@long file]#
[root@long file]#
[root@long file]# sed 's/:/@@@/g' testfile     # 替换文件中所有:为@@@
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
[root@long file]#
[root@long file]# sed '1,3s/:/@@@/g' testfile   # 替换1-3行
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
[root@long file]# sed -e '1s/:/@/g' -e '3s/:/@/g' testfile         # 替换1行和3行的
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
[root@long file]# sed '2,+2s/:/@/g' testfile           # 替换2行及其后两行
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
[root@long file]# sed '2~2s/:/@/g' testfile          # 每隔1行替换
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
[root@long file]#
​
[root@long file]# sed '/SBIN/Is/:/@/g' testfile   # 带sbin字符忽略大小写的行替换
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
[root@long file]# sed '/daemon/,/lp/s/:/@/g' testfile   # daemon和lp字符之间的行替换
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
[root@long file]# sed -e '1,/admin/s/:/@@/g' testfile    # 第一行到adm之间的
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
[root@long file]# sed -e   '/adm/,$s/:/@@/g' testfile   # adm到最后一行的
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
[root@long file]# sed -e   '\%adm%,$s%:%@@%g' testfile     # 其他sed分隔符的指定
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

3、特殊符号的使用

bash 复制代码
[root@long file]# sed -n '/root/!p' testfile            # !
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
[root@long file]# sed  '=' testfile                      # = 行号
1
root:x:0:0:root:/root:/bin/bash
2
bin:x:1:1:bin:/bin:/sbin/nologin
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
5
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
[root@long file]# sed  '1~2s/:/#/g' testfile            # ~步长
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
[root@long file]# sed  's/:/^&^/g' testfile          # &代表匹配到的
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
[root@long file]# sed -n '1p;4p' testfile               # 多条命令
root:x:0:0:root:/root:/bin/bash
adm:x:3:4:adm:/var/adm:/sbin/nologin
[root@long file]# sed -n '1,3{p;=} ' testfile
root:x:0:0:root:/root:/bin/bash
1
bin:x:1:1:bin:/bin:/sbin/nologin
2
daemon:x:2:2:daemon:/sbin:/sbin/nologin
3
​
相关推荐
地衣君3 小时前
RISC-V 开发板 + Ubuntu 23.04 部署 open_vins 过程
linux·ubuntu·risc-v
5:004 小时前
云备份项目
linux·开发语言·c++
码农101号4 小时前
Linux中shell编程表达式和数组讲解
linux·运维·服务器
powerfulzyh4 小时前
非Root用户启动SSH服务经验小结
运维·ssh
云道轩4 小时前
升级centos 7.9内核到 5.4.x
linux·运维·centos
是小满满满满吗4 小时前
传输层:udp与tcp协议
linux·服务器·网络
爱学习的小道长5 小时前
Ubuntu Cursor升级成v1.0
linux·运维·ubuntu
EelBarb5 小时前
seafile:ubuntu搭建社区版seafile12.0
linux·运维·ubuntu
Xam_d_LM5 小时前
【Latex】Windows/Ubuntu 绘制 eps 矢量图通用方法(drawio),支持插入 Latex 数学公式
linux·ubuntu·科研·矢量图·drawio
402 Payment Required5 小时前
serv00 ssh登录保活脚本-邮件通知版
运维·chrome·ssh