sed
(Stream Editor)是 Linux/Unix 系统中强大的文本处理工具,擅长对文本进行替换、删除、插入、追加等操作。它逐行处理输入数据,高效且灵活,广泛用于日志处理、脚本自动化和数据清洗。以下是系统的 sed
学习指南:
一、基本语法
sed [选项] '命令' [输入文件]
-
选项:常用
-i
(直接修改文件)、-e
(执行多个命令)、-n
(静默模式,需配合p
命令显式打印)。 -
命令:由地址和动作组成,格式为
[地址]动作
。
二、核心命令与动作
1. 替换命令 s
sed 's/原文本/新文本/修饰符' # 替换每行第一个匹配项
sed 's/原文本/新文本/g' # 替换每行所有匹配项(g=global)
sed 's/原文本/新文本/gi' # 忽略大小写替换(i=ignore case)
sed 's/原文本/新文本/2' # 替换每行的第2个匹配项
- 示例:将
hello
替换为hi
echo "hello world, hello sed" | sed 's/hello/hi/' # 输出: hi world, hello sed
echo "hello world, hello sed" | sed 's/hello/hi/g' # 输出: hi world, hi sed
2. 删除命令 d
sed '2d' file.txt # 删除第2行
sed '2,5d' file.txt # 删除第2到第5行
sed '/pattern/d' file.txt # 删除包含pattern的行
sed '/^$/d' file.txt # 删除空行(^$ 表示空行)
3. 插入与追加命令 i
和 a
sed '2i 插入的文本' file.txt # 在第2行前插入文本
sed '2a 追加的文本' file.txt # 在第2行后追加文本
sed '/pattern/a 追加的文本' file.txt # 在匹配行后追加文本
4. 修改命令 c
sed '2c 替换整行的文本' file.txt # 将第2行替换为新文本
sed '/pattern/c 替换的文本' file.txt # 将匹配行替换为新文本
5. 打印命令 p
需配合 -n
选项使用:
sed -n '2p' file.txt # 只打印第2行
sed -n '/pattern/p' file.txt # 只打印包含pattern的行
sed -n '2,5p' file.txt # 只打印第2到第5行
三、地址定位
地址用于指定命令作用的行范围:
地址形式 | 说明 |
---|---|
n | 第 n 行(如 2d 删除第2行) |
n,m | 第 n 到第 m 行(如 2,5d 删除第2到第5行) |
$ | 最后一行(如 $d 删除最后一行) |
/pattern/ | 匹配正则表达式的行(如 /error/d 删除包含 error 的行) |
n,/pattern/ | 从第 n 行到第一个匹配 pattern 的行(如 1,/start/p 打印第1行到首个 start 行) |
0,/pattern/ | 从第一行到第一个匹配 pattern 的行(与 1,/pattern/ 类似,但匹配行只处理一次) |
四、高级用法
1. 分组与引用
使用 \(
和 \)
分组,\1
、\2
引用分组内容:
echo "2025-05-27" | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3\/\2\/\1/'
# 输出: 27/05/2025
2. 多行处理
- 替换跨行内容:
sed ':a;N;$!ba; s/原文本/新文本/g' file.txt # 合并所有行后替换
- 删除包含特定字符串的段落(段落以空行分隔):
sed '/pattern/,/^$/d' file.txt # 删除从pattern到下一个空行的内容
3. 原地修改文件
使用 -i
选项直接修改文件:
sed -i 's/old/new/g' file.txt # 直接替换file.txt中的内容
sed -i.bak 's/old/new/g' file.txt # 先备份为file.txt.bak,再修改原文件
4. 执行多个命令
使用 -e
或分号分隔多个命令:
sed -e 's/old/new/' -e 's/foo/bar/' file.txt
sed 's/old/new/; s/foo/bar/' file.txt
五、实战案例
1. 日志处理
- 提取时间戳:
cat access.log | sed -n 's/.*\[\(.*\)\].*/\1/p'
- 删除注释行和空行:
sed -i '/^#/d; /^$/d' config.ini
2. HTML/CSS处理
- 添加DOCTYPE声明:
sed '1i <!DOCTYPE html>' index.html
- 替换CSS链接:
sed 's/old.css/new.css/g' index.html
3. 数据清洗
- 删除多余空格:
sed 's/ */ /g' data.txt
- 转换CSV为TSV:
sed 's/,/\t/g' data.csv > data.tsv
六、常见陷阱与注意事项
- 正则表达式转义:
- 在 BRE 模式下,部分元字符(如 +
、?
、()
)需转义,或使用 -r
选项启用 ERE 模式。
- 引号问题:
- 单引号 '
中不解析变量,需使用双引号 "
或混合使用:
old="apple"
new="banana"
sed "s/$old/$new/g" file.txt # 正确
sed 's/'"$old"'/'"$new"'/g' file.txt # 复杂情况
- 备份文件:
- 使用 -i
直接修改文件时,建议添加备份后缀(如 -i.bak
)以防意外。
七、学习资源推荐
- 在线教程:
- Sed - An Introduction and Tutorial by Bruce Barnett
- 练习工具:
- Regex101:支持 sed 模式调试。
- Sed 练习:在线练习 sed 命令。
掌握 sed
后,你可以高效处理各种文本编辑任务,避免手动操作的繁琐。多练习实际案例,逐渐熟悉其强大的文本处理能力!