1. 基本介绍
- sed 是Stream Editor 的缩写,简称流编辑器;用来处理文件。
- sed 是一行一行读取文件内容并按照要求进行处理,把处理后的结果输出到屏幕
- sed 首先读取文件中的一行内容,把其保存在一个临时缓冲区中。然后根据需求处理临时缓冲区中的行,完成后把该行发送到屏幕上
- sed 把每一行都存在临时缓冲区中,对这个副本进行编辑,所以不会直接修改源文件
- sed 主要用来自动编辑一个或多个文件;简化对该文件的反复操作,对文件进行过滤和转换操作
2. sed 语法结构
sed 常见的语法格式有两中,一种为命令行模式,另一种为脚本模式
2.1. 命令行格式
sed [options] ' 处理动作 ' 文件名
2.1.1. 常用选项
-[e] 进行多次编辑
-[n] 取消默认输出,不自动打印模式空间
-[r] 使用扩展正则表达式
-[i]修改源文件
-[f]指定 sed 脚本的文件名
-
学习案例
# chen @ localhost in ~/Shell [13:39:51] $ sed -ne '/root/=' -ne '/root/p' passwd 1 root:x:0:0:root:/root:/bin/zshi # 在 passwd 文件中的第5行的前面加入 "hello world " 同时在 passwd 文件中的第8行下面插入"hello java" # chen @ localhost in ~/Shell [13:50:10] $ sed -e '2ihello world' -e '5ahello java' passwd root:x:0:0:root:/root:/bin/zshi hello world in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync hello java shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
注意:
-ni
不要一起使用p
命令,不要在使用-i
时使用
2.1.2. 常见动作
注意: 动作必须位于单引号中
p
打印
i
在指定行之前插入内容
o
在指定行之后插入内容
c
替换指定行所有内容
d
删除指定行
2.1.3. 学习示例
-
示例数据
# chen @ localhost in ~/Shell [11:14:06] $ cat -n passwd 1 root:x:0:0:root:/root:/bin/zshi 2 in:x:1:1:bin:/bin:/sbin/nologin 3 ddaemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 sync:x:5:0:sync:/sbin:/bin/sync 6 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
-
对
passwd
文件进行增删改查操作-
打印文件内容
# 打印文件所有内容 # chen @ localhost in ~/Shell [11:15:12] $ sed -n 'p' passwd root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # 打印文件第一行 # chen @ localhost in ~/Shell [11:15:26] $ sed -n '1p' passwd root:x:0:0:root:/root:/bin/zshi # 打印文件第一至三行 # chen @ localhost in ~/Shell [11:16:02] $ sed -n '1,3p' passwd root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin # 打印文件最后一行 # chen @ localhost in ~/Shell [11:16:06] $ sed -n '$p' passwd shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
-
增加文件内容
# chen @ localhost in ~/Shell [11:16:11] $ sed '$ahello' passwd # 在文件最后一行之后增加hello root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown hello # chen @ localhost in ~/Shell [11:19:07] $ sed 'ahello' passwd # # 在文件每行之后增加hello root:x:0:0:root:/root:/bin/zshi hello in:x:1:1:bin:/bin:/sbin/nologin hello ddaemon:x:2:2:daemon:/sbin:/sbin/nologin hello adm:x:3:4:adm:/var/adm:/sbin/nologin hello sync:x:5:0:sync:/sbin:/bin/sync hello shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown hello # chen @ localhost in ~/Shell [11:19:17] $ sed '5ahello' passwd # 在文件第5行之后增加hello root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync hello shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # chen @ localhost in ~/Shell [11:19:26] $ sed '$ihello' passwd # 在文件最后一行之前增加hello root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync hello shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # chen @ localhost in ~/Shell [11:19:37] $ sed 'ihello' passwd # 在文件每行之前增加hello hello root:x:0:0:root:/root:/bin/zshi hello in:x:1:1:bin:/bin:/sbin/nologin hello ddaemon:x:2:2:daemon:/sbin:/sbin/nologin hello adm:x:3:4:adm:/var/adm:/sbin/nologin hello sync:x:5:0:sync:/sbin:/bin/sync hello shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # chen @ localhost in ~/Shell [11:19:46] $ sed '/^root/ihello' passwd # 在文件最以root开头的行之前增加hello hello root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
-
修改文件内容
- # chen @ localhost in ~/Shell [12:34:16] C:1 $ sed '5chello world' passwd # 替换第5行内容为 hello world root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin hello world shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # chen @ localhost in ~/Shell [12:34:36] $ sed 'chello world' passwd # 将每行内容替换为 hello world hello world hello world hello world hello world hello world hello world # chen @ localhost in ~/Shell [12:35:05] $ sed '1,3chello world' passwd # 将1到3行内容替换为 hello world hello world adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # chen @ localhost in ~/Shell [12:36:07] $ sed '/^in/chello world' passwd # 将以in开头的数据替换为 hello world root:x:0:0:root:/root:/bin/zshi hello world ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
-
删除文件内容
# chen @ localhost in ~/Shell [12:36:13] $ sed '1d' passwd # 删除文件第一行 in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # chen @ localhost in ~/Shell [12:41:48] $ sed '1,5d' passwd # 删除文件1至5行 shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # chen @ localhost in ~/Shell [12:42:21] $ sed '$d' passwd # 删除文件最后一行 root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync
-
-
对
passwd
文件进行搜索替换操作语法:
sed [选项] **' s/搜索'**
其中。s
表示 search搜索;斜杠/
表示分隔符。可以自己定义;动作一般为打印p
和全局替换g
# chen @ localhost in ~/Shell [12:48:57] $ sed -n 's/adm/ADM/gp' passwd ADM:x:3:4:ADM:/var/ADM:/sbin/nologin # chen @ localhost in ~/Shell [12:50:11] $ sed -n 's/\/sbin\/nologin/chen/gp' passwd # 将/sbin/nologin 替换为 chen in:x:1:1:bin:/bin:chen ddaemon:x:2:2:daemon:/sbin:chen adm:x:3:4:adm:/var/adm:chen # 注意:搜索替换中的分隔符可以自己搞定 # chen @ localhost in ~/Shell [12:50:59] $ sed -n 's@/sbin/nologin@chen@gp' passwd in:x:1:1:bin:/bin:chen ddaemon:x:2:2:daemon:/sbin:chen adm:x:3:4:adm:/var/adm:chen
-
其他命令
r
从另外文件中读取内容
w
内容另存为
&
保存查找串在替换串中引用,和()相同
=
打印行号
!
对所选行以外的所有行应用命令,放到行数之后
q
退出- 学习示例
# chen @ localhost in ~/Shell [13:34:08] $ sed '3r ./hostname' passwd root:x:0:0:root:/root:/bin/zshi in:x:1:1:bin:/bin:/sbin/nologin ddaemon:x:2:2:daemon:/sbin:/sbin/nologin localhost.localdomain adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown # 将passwd 文件中的1到5行保存至11.txt文件中 sed '1,5w 11.txt' passwd # chen @ localhost in ~/Shell [13:36:07] $ cat -n 11.txt 1 root:x:0:0:root:/root:/bin/zshi 2 in:x:1:1:bin:/bin:/sbin/nologin 3 ddaemon:x:2:2:daemon:/sbin:/sbin/nologin 4 adm:x:3:4:adm:/var/adm:/sbin/nologin 5 sync:x:5:0:sync:/sbin:/bin/sync # chen @ localhost in ~/Shell [13:39:10] $ sed -n '1,5s/adm/&# /gp' passwd # 将adm 替换为adm# adm# :x:3:4:adm# :/var/adm# :/sbin/nologin
- 学习示例
2.1.4. sed 结合正则使用
-
语法结构:
sed 选项 ' sed 命令 | 正则表达式 | 地址定位 ' 文件名
/key/
查询包含关键字的行
/key1/,/key2/
匹配两个关键字之间的行
/key/,x
从匹配关键字的行开始到文件第x行之间的行(包含关键字所在行)
x,/key/
从x行开始到关键字的匹配行之间的行
x,y!
不包含x到y行 -
定址用于决定对那些行进行编辑。地址形式可以是数字、正则表达式或二者的结合
-
如果没有指定地址,sed将处理输入文件的所有行
-
学习案例
# chen @ localhost in ~/Shell [14:09:02] $ sed -nr '3,/^shut/p' passwd ddaemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
2.2. 脚本格式
2.2.1. 用法
sed -f scripts.sh file # 使用脚本处理文件
# 脚本的第一行
#!/bin/sed -f
2.2.2. 注意事项
- 脚本文件是一个 sed 的命令行清单。
- 在每行的末尾不能有空格、制表符或其他文本
- 一行中有多条命令时,应该以分号分隔
- 不需要并且不能用引号保护命令