sed使用

本文最后更新于:2025年11月19日 下午

关键字:用法

sed使用

语法

1
sed [option] [address]command [input file]

如果没有输入文件,那么从标准输入中读取。

option

option 作用
-n 阻止输入行的自动输出(如需打印得需要p命令)
-f 使用脚本文件而不是命令行输入命令
-e 说明后面跟命令,命令行输入多个命令时使用。也可以使用大括号来实现
-E 使用扩展的正则

sed默认使用的正则元字符较少(如不支持+?()|),所以建议加-E选项使用扩展的正则。这样和egrep, grep -E,awk正则表达式才相一致。

地址

默认情况下,sed对每一个输入行都会执行command命令,如果只想对特定的行操作,那么需要address参数。

sed可以指定一个或两个地址。
如果只有一个地址,那么命令应用于这个地址匹配的行。
如果有两个地址,那么命令应用于第一个地址行和第二个地址行区间的所有行。

地址可以是一个数字,也可以是一个正则表达式。

如果地址后面跟有感叹号!,那么表示不匹配这些地址的行才应用命令。

以删除命令d举例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 删除每一行
sed 'd'

# 删除第二行
sed '2d'

# 删除最后一行
sed '$d'

# 删除空行
sed '/^$/d'

# 删除带有hello的行,地址和command之间可以加一个空格
sed '/hello/ d'

# 删除从第一行到以id:开始的行
sed '1,/^id:/ d'

# 删除start开头,end结束之外的行
sed '/start/,/end/! d'

命令

命令 作用
d 删除
p 打印
s 替换
a 在处理行后面追加新行
i 在处理行之前插入
c 以内容替换当前行
1
2
3
4
5
# 打印匹配的行
sed -n '/aaa/p'

# 如果aaa匹配,那么把这一行替换为bbb
sed '/aaa/ cbbbb'

替换(s)

1
[address] s/pattern/replacement/flags

模式使用正则表达式,可以用任意字符分割,如果模式里面游/字符,那么使用其他字符分割更清晰,如替换网站协议(使用@分割):s@https://@http://@

flags

标志 作用
n 1-512的一个数字,表示对第n次出现进行替换
g 对模式的所有次出现都做替换,默认第替换第一次出现
p 打印行,如果sed指定了-n不输出参数,这个参数有用

多重命令与地址嵌套

多重命令通过大括号包起来,分号分割。
地址嵌套就是通过大括号在命令前面再加地址即可。
举例如下:

1
2
3
4
5
6
7
8
# 把每一行的br0替换为br1, up替换为down
sed -E '{s/br0/br1/; s/up/down/}'

# 对1-5行内,删除以#开头的行
sed -E '1,5 {/^#/ d}'

# 对1-6行内,删除包含stp的行,行内包含eth0则进行替换
sed -E '1,6 {/stp/ d; /eth0/ s/addif/delif/}'

sed使用
https://leon0625.github.io/2022/09/03/04910dde347d/
作者
leon.liu
发布于
2022年9月3日
许可协议