sed 命令
#
sed
(Stream Editor)是一个强大的流编辑器,用于对文本进行过滤和转换。它可以执行插入、删除、替换、提取等操作,是 Linux 文本处理的核心工具之一。
语法
#
或
sed [选项] -f 脚本文件 [输入文件...]
常用选项
#
选项 |
描述 |
-e 命令 |
添加要执行的命令 |
-f 文件 |
从文件中添加命令 |
-i[后缀] |
直接修改文件(就地编辑),可选择创建带后缀的备份 |
-n |
禁止自动打印模式空间 |
-r, -E |
使用扩展正则表达式 |
-s |
将多个文件视为独立的,而不是将它们视为单个连续的长流 |
常用命令
#
命令 |
描述 |
s/正则/替换/[标志] |
替换匹配的文本 |
p |
打印匹配的行 |
d |
删除匹配的行 |
a\文本 |
在匹配行后追加文本 |
i\文本 |
在匹配行前插入文本 |
c\文本 |
用文本替换匹配的行 |
y/源字符/目标字符/ |
转换字符 |
q |
退出 sed |
n |
读取下一行 |
r 文件 |
从文件读取文本 |
w 文件 |
将匹配的行写入文件 |
替换标志
#
标志 |
描述 |
g |
全局替换(替换所有匹配) |
数字 |
只替换第 n 个匹配 |
p |
打印包含替换的行 |
i |
忽略大小写 |
w 文件 |
将替换结果写入文件 |
地址匹配
#
地址格式 |
描述 |
数字 |
匹配特定行号 |
$ |
匹配最后一行 |
/正则/ |
匹配正则表达式 |
地址1,地址2 |
匹配从地址 1 到地址 2 的范围 |
地址! |
匹配除地址外的所有行 |
地址~步长 |
从地址开始,每隔步长行匹配一次 |
常见用法
#
1. 替换文本
#
# 替换每行中第一次出现的"old"为"new"
sed 's/old/new/' file.txt
# 全局替换(替换所有匹配)
sed 's/old/new/g' file.txt
# 只替换第2次出现的"old"
sed 's/old/new/2' file.txt
# 忽略大小写
sed 's/old/new/i' file.txt
2. 删除行
#
# 删除空行
sed '/^$/d' file.txt
# 删除包含"pattern"的行
sed '/pattern/d' file.txt
# 删除第5行
sed '5d' file.txt
# 删除第5行到第10行
sed '5,10d' file.txt
# 删除最后一行
sed '$d' file.txt
3. 打印特定行
#
# 打印包含"pattern"的行
sed -n '/pattern/p' file.txt
# 打印第5行到第10行
sed -n '5,10p' file.txt
# 打印文件的第一行
sed -n '1p' file.txt
# 打印文件的最后一行
sed -n '$p' file.txt
4. 添加和插入文本
#
# 在包含"pattern"的行后添加文本
sed '/pattern/a\新文本' file.txt
# 在包含"pattern"的行前插入文本
sed '/pattern/i\新文本' file.txt
# 在第5行后添加文本
sed '5a\新文本' file.txt
5. 替换整行
#
# 将包含"pattern"的行替换为新文本
sed '/pattern/c\新文本' file.txt
# 将第5行替换为新文本
sed '5c\新文本' file.txt
6. 多个命令
#
# 使用分号分隔多个命令
sed 's/old/new/g; s/foo/bar/g' file.txt
# 使用-e选项指定多个命令
sed -e 's/old/new/g' -e 's/foo/bar/g' file.txt
7. 直接修改文件
#
# 直接修改文件(不创建备份)
sed -i 's/old/new/g' file.txt
# 直接修改文件并创建备份
sed -i.bak 's/old/new/g' file.txt
8. 使用正则表达式
#
# 使用基本正则表达式
sed 's/[0-9]\{3\}/NUMBER/g' file.txt
# 使用扩展正则表达式
sed -E 's/[0-9]{3}/NUMBER/g' file.txt
9. 引用和转义
#
# 在替换中使用捕获组
sed -E 's/(foo|bar)/\1-modified/g' file.txt
# 在替换中使用变量
name="John"
sed "s/USER/$name/g" file.txt
10. 高级用法
#
# 只处理文件的特定部分
sed '/start/,/end/s/old/new/g' file.txt
# 每隔2行处理一次
sed '1~2s/old/new/g' file.txt
# 除了第5行外都替换
sed '5!s/old/new/g' file.txt
# 从文件读取替换内容
sed '/pattern/r add_file.txt' file.txt
# 将匹配行写入文件
sed -n '/pattern/w output.txt' file.txt
实用示例
#
1. 删除 HTML 标签
#
sed 's/<[^>]*>//g' file.html
2. 在每行开头添加行号
#
sed = file.txt | sed 'N;s/\n/. /'
3. 将 DOS/Windows 格式的文本转换为 Unix 格式
#
4. 提取特定行之间的内容
#
sed -n '/START/,/END/p' file.txt
5. 注释或取消注释配置文件中的行
#
# 注释包含"pattern"的行
sed 's/^.*pattern.*$/#&/' file.conf
# 取消注释以#开头的行
sed 's/^#\(.*\)$/\1/' file.conf
提示
#
- 使用单引号包围 sed 命令可以防止 shell 解释特殊字符
- 使用双引号时,可以在命令中使用变量
- 使用
-i
选项时要小心,它会直接修改原文件
- 在处理大文件时,sed 比许多文本编辑器更高效
- 使用
-n
选项可以抑制默认输出,只显示特定的行
- 在复杂的 sed 脚本中,可以使用
#
添加注释
- 使用
-E
或-r
选项可以使用扩展正则表达式,简化语法
- 在处理包含特殊字符的文本时,可以使用不同的分隔符,如
s|old|new|g
- sed 是行处理工具,默认不处理跨行的模式
- 对于非常复杂的文本处理任务,可能需要结合使用 sed、awk 和 grep