Linux sed 命令完全指南:从入门到精通

Linux sed 命令完全指南:从入门到精通

Someone Lv5

sed(Stream Editor)是 Linux 中最强大的文本处理工具之一。它以流式方式逐行处理文本,常用于自动化文本替换、过滤、格式化等场景。与 grep 的查找功能和 awk 的列处理能力互补,sed行编辑和替换方面无可替代。

本文将系统介绍 sed 的核心用法,涵盖从基础到进阶的实用技巧。

一、基础语法

sed 的基本调用格式为:

1
2
3
sed [选项] '命令' 文件名
# 或通过管道
cat 文件 | sed '命令'

最常用的选项:

选项 作用
-n 关闭默认输出(只打印被 p 命令显式匹配的行)
-i 直接修改文件(原地编辑)
-e 执行多条命令
-r 启用扩展正则表达式(或 -E
选项作用
-n关闭默认输出(只打印被 p 命令显式匹配的行)
-i直接修改文件(原地编辑)
-e执行多条命令
-r / -E启用扩展正则表达式

二、核心命令详解

1. 替换命令 s(最常用)

sed 's/旧内容/新内容/标志'

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 基本替换 - 每行只替换第一个匹配
echo "hello world hello" | sed 's/hello/hi/'
# 输出: hi world hello

# 全局替换(g 标志)
echo "hello world hello" | sed 's/hello/hi/g'
# 输出: hi world hi

# 忽略大小写替换(i 标志)
echo "Hello World" | sed 's/hello/hi/i'
# 输出: hi World

# 只替换第 2 次出现
echo "a a a a" | sed 's/a/b/2'
# 输出: a b a a

2. 打印命令 p

常与 -n 配合使用,只输出匹配的行:

1
2
3
4
5
6
7
8
# 打印包含 "error" 的行
sed -n '/error/p' /var/log/syslog

# 打印第 5 行
sed -n '5p' /etc/passwd

# 打印第 10~20 行
sed -n '10,20p' file.txt

3. 删除命令 d

1
2
3
4
5
6
7
8
9
10
11
# 删除包含 "debug" 的行
sed '/debug/d' app.log

# 删除第 3~5 行
sed '3,5d' file.txt

# 删除空行(^$ 匹配空行)
sed '/^$/d' file.txt

# 删除注释行(以 # 开头的行)
sed '/^#/d' config.conf

4. 插入和追加

1
2
3
4
5
6
7
8
# 在第 3 行前插入(i 命令)
sed '3i\这是插入的行' file.txt

# 在第 3 行后追加(a 命令)
sed '3a\这是追加的行' file.txt

# 在匹配行后追加多行(用 \n 分隔)
sed '/pattern/a\第一行\n第二行' file.txt

5. 更改命令 c

用新内容替换整行:

1
2
3
4
5
# 将第 2 行替换为新内容
sed '2c\这是新的第2行' file.txt

# 将包含 "old_config" 的行替换
sed '/old_config/c\new_config = value' config.ini

三、地址范围与模式匹配

行号寻址

1
2
3
4
5
6
7
8
# 处理第 1 行
sed '1s/foo/bar/' file

# 处理第 1~10 行
sed '1,10s/foo/bar/' file

# 从第 5 行到文件末尾
sed '5,$s/foo/bar/' file

模式匹配寻址

1
2
3
4
5
# 在 "BEGIN" 和 "END" 之间的行执行替换
sed '/BEGIN/,/END/s/old/new/' file

# 从匹配行到文件末尾执行操作
sed '/START/,$d' file

取反操作 !

1
2
3
4
5
# 删除除了第 1 行以外的所有行
sed '1!d' file.txt

# 对不匹配的行执行替换
sed '/protected/!s/foo/bar/' config.txt

四、实战案例

案例 1:批量替换 Nginx 配置中的域名

1
2
sed -i 's/old-domain.com/new-domain.com/g' /etc/nginx/sites-enabled/*
echo "所有 Nginx 配置文件中的域名已替换"

案例 2:提取配置文件中的有效配置

1
2
# 删除所有注释行和空行,并保存为新文件
sed '/^#/d; /^$/d' /etc/ssh/sshd_config > sshd_clean.conf

案例 3:在 CSV 文件中增加列

1
2
3
# 在第 1 行后插入新表头,在数据行追加新列值
sed -i '1a\new_column' data.csv
sed -i '2,$s/$/,default_value/' data.csv

案例 4:日志文件时间戳格式化

1
2
# 假设日志格式为 "YYYY-MM-DD HH:MM:SS",改为 "YYYY/MM/DD HH:MM:SS"
sed -i 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\1\/\2\/\3/g' app.log

案例 5:多文件批量替换

1
2
# 递归替换所有 .html 文件中的旧链接
find . -name "*.html" -exec sed -i 's|http://old-site.com|https://new-site.com|g' {} \;

五、高级技巧

1. 使用分组和反向引用

通过 \(...\) 捕获分组,用 \1\2 引用:

1
2
3
4
5
6
# 调换两列的位置(以逗号分隔)
echo "lastname,firstname" | sed 's/\(.*\),\(.*\)/\2,\1/'
# 输出: firstname,lastname

# 将 Markdown 标题转为 HTML
echo "## Section Title" | sed 's/^\(#*\) \(.*\)/<h\1>\2<\/h\1>/'

2. 在替换中使用 shell 变量

1
2
3
old="foo"
new="bar"
sed "s/$old/$new/g" file.txt

注意:双引号使变量展开,单引号会保持字面值。

3. 多条命令组合

1
2
3
4
5
6
7
8
9
10
11
# 方法1:使用 -e 选项
sed -e 's/foo/bar/' -e '/^$/d' file.txt

# 方法2:使用分号分隔
sed 's/foo/bar/; /^$/d' file.txt

# 方法3:写入脚本文件
# 创建 script.sed 文件,内容如下:
# s/foo/bar/
# /^$/d
sed -f script.sed file.txt

4. 原地编辑并备份

1
2
3
# 编辑前创建 .bak 备份文件
sed -i.bak 's/foo/bar/g' important.conf
# 生成 important.conf(修改后)和 important.conf.bak(原始备份)

六、常见陷阱与注意事项

  1. 分隔符不限于 /:当路径中含斜杠时,可用 #|@ 等作为分隔符

    1
    sed 's|/usr/local|/opt|g' paths.txt
  2. Mac 的 -i 不同:macOS 上的 sed -i 必须跟备份扩展名,即使不需要也要给空串:

    1
    2
    3
    4
    # macOS:
    sed -i '' 's/foo/bar/g' file.txt
    # Linux:
    sed -i 's/foo/bar/g' file.txt
  3. 大文件处理sed 流式处理不会将整个文件读入内存,适合处理 GB 级大文件

  4. 特殊字符转义:在替换中,& 代表匹配的整段内容,\1~`\9` 代表分组引用

七、小结

sed 是 Linux 文本处理”三剑客”(grepsedawk)中的核心成员。掌握 sed 后,你可以:

  • 一键完成批量文本替换
  • 快速提取和过滤日志信息
  • 编写自动化配置修改脚本
  • 处理 GB 级大文件而不消耗大量内存

从简单的替换到复杂的多行编辑,sed 都能胜任。建议读者在日常工作中多使用 sed 完成文本处理任务,逐步积累经验,你会发现它比手动编辑文件高效得多。


本文由AI辅助生成,内容仅供参考

  • 标题: Linux sed 命令完全指南:从入门到精通
  • 作者: Someone
  • 创建于 : 2026-06-07 14:28:00
  • 更新于 : 2026-06-18 08:39:57
  • 链接: https://demo-blog.qusite.cn/2026-06-07-sed-command-guide/
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。