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
​
相关推荐
爱喝水的鱼丶13 分钟前
SAP-ABAP: ABAP ASSIGN COMPONENT 语句详解:动态字段符号的利器作用用法示例详解
运维·开发语言·sap·abap·开发经验·动态字段符号
FLS16814 分钟前
Kali搭建sqli-labs靶场
linux·sql·安全·网络安全
清寒敲代码24 分钟前
k8s核心技术-Helm
运维·容器·kubernetes
quqi9925 分钟前
Enable FIPS in ubuntu (by quqi99)
linux·运维·ubuntu
人工智能训练师30 分钟前
在Ubuntu中如何使用PM2来运行一个编译好的Vue项目
linux·运维·服务器·vue.js·ubuntu·容器
程序媛Dev37 分钟前
50.4k Star!我用这个神器,在五分钟内搭建了一个私有 Git 服务器!
运维·服务器·git
zhongwenhua52042 分钟前
ZeroMQ 编译 & 项目使用流程文档
linux·zmq
Lynnxiaowen2 小时前
今天继续学习shell脚本
linux·运维·学习·云计算·bash
云上小朱2 小时前
文件下载-ubuntu操作系统下载指定文件
linux·shell
hmcjn(小何同学)2 小时前
轻松Linux-9.进程间通信
linux·运维·服务器·c++·bash