概述
sed
命令的详细教程,涵盖进阶用法、正则表达式、特殊场景及常见示例- 资料已经分类整理好:
https://pan.quark.cn/s/26d73f7dd8a7
1. 基本概念与语法
sed
(Stream Editor)是行编辑器,逐行处理文本并输出结果,默认不修改原文件。
核心语法:
sed [选项] '命令' 输入文件
常用选项:
选项 | 作用 |
---|---|
-n |
静默模式,只输出被处理的行 |
-i |
直接修改原文件(危险!建议先备份) |
-e |
允许多个编辑命令串联执行 |
-f |
指定脚本文件执行命令 |
-r |
使用扩展正则表达式(简化复杂模式) |
2. 常用编辑命令
2.1 替换命令 s
sed 's/原文本/替换文本/标志' 文件
标志参数:
g
:全局替换(默认只替换每行第一个匹配)数字
:替换第N个匹配(如3
表示替换每行第3个匹配)p
:打印替换后的行(需配合-n
使用)w 文件名
:将替换结果写入新文件
示例:
# 替换每行第一个 "apple" 为 "banana"
sed 's/apple/banana/' fruits.txt
# 全局替换所有 "apple" 为 "banana"
sed 's/apple/banana/g' fruits.txt
# 仅替换第3行的 "apple" 为 "banana"
sed '3s/apple/banana/' fruits.txt
# 替换第2行到第5行的 "apple" 为 "banana"
sed '2,5s/apple/banana/' fruits.txt
# 替换每行第2个 "apple" 为 "banana"
sed 's/apple/banana/2' fruits.txt
# 替换所有 "apple" 并保存到新文件
sed 's/apple/banana/g' fruits.txt > new_fruits.txt
# 直接修改原文件(危险!)
sed -i 's/apple/banana/g' fruits.txt
2.2 删除命令 d
sed '行号或范围d' 文件
示例:
# 删除第5行
sed '5d' data.txt
# 删除第2行到第8行
sed '2,8d' data.txt
# 删除空行
sed '/^$/d' data.txt
# 删除包含 "error" 的行
sed '/error/d' logs.txt
# 删除以 "#" 开头的注释行
sed '/^#/d' config.ini
2.3 打印命令 p
需配合-n
选项使用,否则会输出所有行:
sed -n '行号或范围p' 文件
示例:
# 打印第10行
sed -n '10p' large_file.txt
# 打印第5行到第15行
sed -n '5,15p' large_file.txt
# 打印包含 "warning" 的行
sed -n '/warning/p' logs.txt
# 打印以 "user:" 开头的行
sed -n '/^user:/p' auth.log
2.4 插入与追加命令
i
:在指定行前插入内容a
:在指定行后追加内容
示例:
# 在第1行前插入 "Header:"
sed '1i\Header:' data.txt
# 在包含 "Section" 的行后追加 "Subsection:"
sed '/Section/a\Subsection:' document.txt
# 在空行后追加 "New line"
sed '/^$/a\New line' empty_lines.txt
3. 高级用法
3.1 正则表达式(基础)
sed
默认使用基本正则表达式(BRE),部分元字符需转义:
^
:行首$
:行尾.
:匹配任意单个字符*
:匹配前一个字符0次或多次[]
:匹配括号内任意字符\(\)
:分组\|
:或(需转义为\|
)
示例:
# 删除所有以数字开头的行
sed '/^[0-9]/d' data.txt
# 将所有以 "www." 开头的域名替换为 "https://www."
sed 's/^www\./https:\/\/www./' urls.txt
# 提取IP地址(简化版)
sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' logs.txt
3.2 扩展正则表达式(-r
选项)
使用-r
选项后,无需转义元字符:
+
:匹配前一个字符1次或多次?
:匹配前一个字符0次或1次()
:分组|
:或
示例:
# 匹配 email 地址(简化版)
sed -r -n 's/.*([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}).*/\1/p' contacts.txt
# 将 "color" 或 "colour" 统一替换为 "color"
sed -r 's/colou?r/color/g' document.txt
3.3 引用变量
在脚本中使用变量时,需用双引号包裹命令:
old="apple"
new="banana"
sed "s/$old/$new/g" fruits.txt
3.4 多行处理
N
:将下一行追加到模式空间D
:删除模式空间的第一行P
:打印模式空间的第一行
示例:合并连续的空行为一个空行:
sed '/^$/{N;/^\n$/D}' file.txt
4. 特殊场景示例
4.1 修改配置文件
# 将 /etc/hosts 中的 localhost 注释取消
sed -i '/localhost/s/^#//' /etc/hosts
# 修改 MySQL 配置中的端口号
sed -i 's/port = 3306/port = 3307/g' /etc/mysql/my.cnf
4.2 文本格式化
# 给每行添加行号
sed = file.txt | sed 'N;s/\n/ /'
# 将逗号分隔的 CSV 转为制表符分隔
sed 's/,/\t/g' data.csv
4.3 批量重命名文件
# 将所有 .txt 文件重命名为 .text
ls *.txt | sed 's/\(.*\)\.txt/mv & \1.text/' | sh
5. 常见问题与技巧
处理包含斜杠的路径:
# 使用其他分隔符(如`#`) sed 's#/old/path#/new/path#g' config.conf
保留原文件备份:
sed -i.bak 's/old/new/g' file.txt # 会生成 file.txt.bak
同时执行多个命令:
sed -e 's/old/new/' -e '/delete/d' file.txt
复杂脚本:
创建script.sed
文件:s/hello/hi/g /error/d 1i\This is a header
执行:
sed -f script.sed input.txt
6. 总结
sed
是强大的文本处理工具,适合自动化修改、提取和转换文本。核心是掌握:
- 替换命令:
s/原文本/新文本/标志
- 删除命令:
d
- 打印命令:
p
(配合-n
) - 正则表达式:基础与扩展语法
- 安全操作:避免直接修改原文件(先备份或用
-i.bak
)
通过组合不同命令和正则表达式,sed
可以高效处理各种文本处理任务。