1 简介
sed
是 Stream Editor
的缩写,即“流编辑器”。
sed
是一种非交互式的文本处理工具,用于对文本文件或标准输入(如管道)进行快速的过滤和转换操作。它在处理文本数据时可以逐行读取并应用编辑命令,无需人工干预,非常适合用于自动化批处理任务。
2 命令格式
sed [options] [script] file
- options:用于控制 sed 的行为,如 -i、-n 等。
- script:sed 执行的操作脚本,如替换、删除、插入等。
- file:要处理的文件。
3 参数
参数 | 参数说明 |
---|---|
-e | 允许多条 sed 命令一起执行。 |
-i[SUFFIX] | 直接修改文件内容,并生成备份 (可选 SUFFIX 指定备份文件后缀) |
-n | 禁用默认输出,仅输出 p 命令或其他指令显示的内容 |
-f scriptfile | 从外部文件读取 sed 脚本 |
-r 或 -E | 启用扩展正则表达式语法 |
4 sed 脚本命令
命令 | 作用 |
---|---|
s | 替换文本:将匹配的文本替换为指定的内容。 sed 's/old/new/' file :将每行第一个 old 替换为 new。 |
d | 删除匹配的行。 sed '/pattern/d' file :删除包含 pattern 的所有行。 |
p | 打印匹配的行。需要与 -n 参数配合使用,避免重复输出所有内容。 sed -n '/pattern/p' file :打印包含 pattern 的所有行。 |
a | 在指定行之后追加文本。 sed '3 a\new line' file :在第 3 行后追加 new line。 |
i | 在指定行之前插入文本。 sed '3 i\new line' file :在第 3 行前插入 new line。 |
c | 替换指定行的内容。 sed '2,4 c\new content' file :将第 2 到第 4 行替换为 new content。 |
q | 提前退出 sed 。常用于处理大文件时,仅处理前几行或满足条件后退出。 sed '5q' file :读取到第 5 行后退出。 |
n | 读取下一行并应用脚本中指定的命令。 sed 'n;s/foo/bar/' file :对奇数行不做处理,对偶数行替换 foo 为 bar。 |
g | 在替换命令中,全局替换行中所有匹配的字符串。 sed 's/foo/bar/g' file :将每行所有的 foo 替换为 bar。 |
h | 将当前模式空间的内容复制到保持空间(hold space)。 sed '/pattern/h' file :将匹配 pattern 的行复制到保持空间。 |
H | 将当前模式空间的内容追加到保持空间(hold space)。 sed '/pattern/H' file :将匹配 pattern 的行追加到保持空间。 |
x | 交换保持空间和模式空间的内容。 sed 'x' file :交换当前行和之前保存的内容。 |
y | 替换字符(类似 tr 命令),逐字符进行转换,而非正则表达式匹配。 sed 'y/abc/123/' file :将 a 替换为 1,b 替换为 2,c 替换为 3。 |
= | 打印当前行号。 sed '=' file :打印每行的行号。 |
{} | 将多条命令组合在一起,用于同一范围或条件下执行多条操作。 sed '/pattern/{s/foo/bar/;d}' file :匹配 pattern 时替换 foo 为 bar 并删除整行。 |
:label | 定义标签,用于 b 或 t 命令跳转。 sed ':start; /pattern/b end; n; b start; :end' file :匹配 pattern 后跳到标签 end。 |
b | 无条件跳转到指定标签(或脚本末尾)。 sed '/pattern/b end' file :匹配 pattern 时跳转到标签 end。 |
t | 条件跳转:如果之前的替换成功,则跳转到指定标签(或脚本末尾)。 sed '/pattern/s/foo/bar/;t end' file :替换成功后跳到标签 end。 |
r | 从文件中读取内容并插入到当前行之后。 sed '/pattern/r otherfile' file :在匹配 pattern 的行后插入 otherfile 的内容。 |
w | 将模式空间的内容写入指定文件。 sed '/pattern/w output.txt' file :将匹配 pattern 的行写入 output.txt。 |
s/// | 替换命令:可配合多个标志,如 g(全局) 、i(忽略大小写) 、p(打印替换的行) 。 sed 's/foo/bar/g' file :将每行所有的 foo 替换为 bar。 |
5 参数使用说明
5.1 -e 参数
- 作用:
-e
参数的作用是允许sed
执行多条命令,即将多条操作组合在一个命令中,而不需要分开写多个sed
命令。 - 例子:读取 test 文件,并执行两个替换命令,把 hello 替换成 Hello,把 python 替换成 scala。
[root@doc-nginx opt] cat >test<<EOF
> hello java
> hello python
> java and python, hello
> EOF
[root@doc-nginx opt] cat test
hello java
hello python
java and python, hello
[root@doc-nginx opt]# 把 hello 替换成 Hello, python 替换成 scala
[root@doc-nginx opt] sed -e 's/hello/Hello/g' -e 's/python/scala/g' test
Hello java
Hello scala
5.2 -n 参数
- 作用:
-n
参数和p
命令常常一起使用,-n
参数用于禁止默认输出,而p
命令用于打印匹配的行。这使得sed
只输出符合条件的行,而不显示其他行。 - 例子:读取 test 文件,并输出包含 scala 的行。
[root@doc-nginx opt] cat test
hello java
hello python
java and python, hello
[root@doc-nginx opt]# 如果不带 -n 参数,sed 会默认输出文件的内容,而 p 命令则会输出匹配的内容
[root@doc-nginx opt] sed '/python/p' test
hello java
hello python
hello python
java and python, hello
java and python, hello
[root@doc-nginx opt]
[root@doc-nginx opt] sed -n '/python/p' test
hello python
java and python, hello
5.3 -f 参数
- 作用:
-f
参数用于指定一个包含sed
脚本的文件,从而让sed
按照文件中的指令逐行处理输入内容。这适用于需要执行多条复杂命令的场景,避免在命令行中书写繁琐的代码。 - 例子:创建一个 sed 的脚本文件,目的是把 hello 替换成 Hello,把 python 替换成 scala。
[root@doc-nginx opt]# 创建 sed.script,包含两条脚本
[root@doc-nginx opt] cat >sed.script<<EOF
> s/hello/Hello/g # 把 hello 替换成 Hello
> s/python/scala/g # 把 python 替换成 scala
> EOF
[root@doc-nginx opt]
[root@doc-nginx opt] sed -f sed.script test
Hello java
Hello scala
java and scala, Hello
5.4 -i 参数
- 作用:
-i
参数用于直接修改源文件(即在原地编辑文件内容),而不是将结果输出到标准输出或另一个文件。这个参数特别适用于需要对文件进行批量修改的场景。 - 例子:读取 test 文件,并把 hello 替换成 perfect,再次读取 test 文件确定文件已被修改。
[root@doc-nginx opt] cat test
hello java
hello python
java and python, hello
[root@doc-nginx opt]
[root@doc-nginx opt] sed -i 's/hello/perfect/g' test
[root@doc-nginx opt]# 再次读取文件,发现文件已被修改
[root@doc-nginx opt] cat test
perfect java
perfect python
java and python, perfect
6 sed 命令使用说明
6.1 s 命令
- 格式:
s/old/new/
- 作用:将匹配的文本替换为指定的内容。
上面在介绍 sed
参数时,已大量使用了 s
命令,因此不再举例。
6.2 d 命令
- 作用:
d
命令用于删除匹配的行,它可以根据模式匹配删除指定行或范围的行。sed
处理文件时默认输出每一行,但使用d
命令后,匹配的行将被删除且不会输出。 - 例子1:删除匹配包含 java 的行,命令为
/java/d
[root@doc-nginx opt] cat test
perfect java
perfect python
java and python, perfect
[root@doc-nginx opt] sed '/java/d' test
perfect python
- 例子2:删除第三行,命令为
3d
[root@doc-nginx opt] cat -n test
1 perfect java
2 perfect python
3 java and python, perfect
[root@doc-nginx opt]
[root@doc-nginx opt] sed '3d' test
perfect java
perfect python
- 例子3:删除第二至第三行,命令为
2,3d
[root@doc-nginx opt] cat -n test
1 perfect java
2 perfect python
3 java and python, perfect
[root@doc-nginx opt]
[root@doc-nginx opt] sed '2,3d' test
perfect java
- 例子4:使用正则表达式,删除空行,命令为
/^$/d
[root@doc-nginx opt] cat -n test
1 perfect java
2
3
4 perfect python
5
6
7 java and python, perfect
[root@doc-nginx opt]
[root@doc-nginx opt] sed '/^$/d' test
perfect java
perfect python
java and python, perfect
6.3 p 命令
- 作用:
p
命令用于打印匹配的行。在sed
中,默认会将所有行输出,但配合-n
参数时可以抑制默认输出,使得p
命令只打印特定的行。 - 例子1:打印包含 java 的行,命令为
/java/p
[root@doc-nginx opt]# sed -n '/java/p' test
perfect java
java and python, perfect
- 例子2:打印第 5 行,命令为
5p
[root@doc-nginx opt] cat test -n
1 perfect java
2 perfect python
3 java and python, perfect
4 hello golang
5 hello shell
[root@doc-nginx opt]#
[root@doc-nginx opt] sed -n '5p' test
hello shell
- 例子3:打印第 2 行到第 4 行,命令为
2,4p
[root@doc-nginx opt] sed -n '2,4p' test
perfect python
java and python, perfect
hello golang
- 例子4:匹配包含
java
的行, 并把java
替换成JAVA
,打印,命令为s/java/JAVA/p
[root@doc-nginx opt] cat test
perfect java
perfect python
java and python, perfect
hello golang
hello shell
[root@doc-nginx opt] sed -n 's/java/JAVA/p' test
perfect JAVA
JAVA and python, perfect
- 例子5:在第 2 行到第 3 行 中,匹配包含
java
的行, 并把java
替换成JAVA
,打印,命令为2,3{s/java/JAVA/p}
[root@doc-nginx opt] cat -n test
1 perfect java
2 perfect python
3 java and python, perfect
4 hello golang
5 hello shell
[root@doc-nginx opt] sed -n '2,3{s/java/JAVA/p}' test
JAVA and python, perfect
- 例子6:删除包含
hello
的行,并打印剩余的行,命令为 ``
[root@doc-nginx opt] cat -n test
1 perfect java
2 perfect python
3 java and python, perfect
4 hello golang
5 hello shell
[root@doc-nginx opt]
[root@doc-nginx opt] sed -n '/hello/d;p' test
perfect java
perfect python
java and python, perfect
6.4 a 命令
- 作用:
a
命令用于在指定的行后面追加新内容。这是sed
中一个强大的插入命令,可以在特定行之后插入文本。 - 例子1:在第3行后追加一行,命令
3a\This is the new line.
[root@doc-nginx opt] cat -n test
1 perfect java
2 perfect python
3 java and python, perfect
4 hello golang
5 hello shell
[root@doc-nginx opt]
[root@doc-nginx opt] sed '3a\This is the new line.' test
perfect java
perfect python
java and python, perfect
This is the new line.
hello golang
hello shell
- 例子2:匹配
java
的行,并在每行后追加java 666
,命令为/java/a\java 666
[root@doc-nginx opt] cat -n test
1 perfect java
2 perfect python
3 java and python, perfect
4 hello golang
5 hello shell
[root@doc-nginx opt]
[root@doc-nginx opt] sed '/java/a\java 666' test
perfect java
java 666
perfect python
java and python, perfect
java 666
hello golang
hello shell
- 例子3:在结尾插入一行
I am the last row
,命令为$a\I am the last row
[root@doc-nginx opt] cat -n test
1 perfect java
2 perfect python
3 java and python, perfect
4 hello golang
5 hello shell
[root@doc-nginx opt]
[root@doc-nginx opt] sed '$a\I am the last row' test
perfect java
perfect python
java and python, perfect
hello golang
hello shell
I am the last row
- 例子4:动态在第二行后追加
I am the third row
,命令为2a\I am the third row
[root@doc-nginx opt] cat -n test
1 perfect java
2 perfect python
3 java and python, perfect
4 hello golang
5 hello shell
[root@doc-nginx opt]
[root@doc-nginx opt] sed '2a\I am the third row' test
perfect java
perfect python
I am the third row
java and python, perfect
hello golang
hello shell