Linux sed命令(Stream Editor,流编辑器)是一个强大的文本处理工具,用于对文本进行过滤和转换。
提示: sed命令以行为单位处理文本,支持正则表达式,是Shell脚本编程中不可或缺的工具。
语法格式
sed [选项] '命令' 输入文件
sed [选项] -e '命令1' -e '命令2' 输入文件
sed [选项] -f 脚本文件 输入文件
常用选项
| 选项 |
说明 |
-n |
安静模式,只显示处理后的行 |
-e |
指定要执行的sed命令 |
-f |
从文件中读取sed脚本 |
-i |
直接修改文件内容 |
-r |
使用扩展正则表达式 |
-i.bak |
修改文件前创建备份(.bak后缀) |
sed命令语法
| 命令 |
语法 |
说明 |
| 替换 |
s/原字符串/新字符串/[标志] |
替换匹配的文本 |
| 删除 |
d |
删除匹配的行 |
| 插入 |
i\文本 |
在指定行前插入文本 |
| 追加 |
a\文本 |
在指定行后追加文本 |
| 读取文件 |
r 文件名 |
读取文件内容并插入 |
| 写入文件 |
w 文件名 |
将匹配行写入文件 |
| 打印 |
p |
打印匹配的行 |
| 下一行 |
n |
读取下一行到模式空间 |
使用示例
示例1:文本替换
# 将文件中的"apple"替换为"orange"
sed 's/apple/orange/g' file.txt
# 只替换每行第一个匹配的"apple"
sed 's/apple/orange/' file.txt
# 替换第2行到第5行中的"apple"
sed '2,5s/apple/orange/g' file.txt
示例2:直接修改文件
# 直接修改文件内容(危险操作)
sed -i 's/old/new/g' file.txt
# 修改前创建备份文件
sed -i.bak 's/old/new/g' file.txt
示例3:删除行
# 删除第3行
sed '3d' file.txt
# 删除第2-5行
sed '2,5d' file.txt
# 删除包含"error"的行
sed '/error/d' file.txt
# 删除空行
sed '/^$/d' file.txt
示例4:插入和追加文本
# 在第3行前插入文本
sed '3i\插入的文本' file.txt
# 在第3行后追加文本
sed '3a\追加的文本' file.txt
# 在文件开头插入文本
sed '1i\文件头' file.txt
# 在文件末尾追加文本
sed '$a\文件尾' file.txt
示例5:打印特定行
# 打印第5行
sed -n '5p' file.txt
# 打印第10-20行
sed -n '10,20p' file.txt
# 打印包含"success"的行
sed -n '/success/p' file.txt
# 打印从包含"start"到包含"end"的所有行
sed -n '/start/,/end/p' file.txt
示例6:使用正则表达式
# 使用扩展正则表达式(匹配数字)
sed -r 's/[0-9]+/NUM/g' file.txt
# 替换所有邮箱地址
sed -r 's/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}/EMAIL/g' file.txt
# 删除HTML标签
sed 's/<[^>]*>//g' file.html
示例7:多重操作
# 执行多个sed命令
sed -e 's/foo/bar/g' -e '/^#/d' file.txt
# 使用分号分隔多个命令
sed 's/foo/bar/g; s/baz/qux/g' file.txt
# 使用脚本文件
echo "s/old/new/g" > script.sed
echo "/^#/d" >> script.sed
sed -f script.sed file.txt
示例8:实际应用场景
# 修改配置文件中的设置
sed -i 's/^#Port 22/Port 2222/' /etc/ssh/sshd_config
# 批量重命名文件(结合find使用)
find . -name "*.txt" -exec sed -i 's/old/new/g' {} \;
# 提取日志中的特定信息
cat access.log | sed -n '/404/p' | sed 's/.*\(GET [^ ]*\).*/\1/p'
# 格式化文本
echo "one,two,three" | sed 's/,/\n/g'
示例9:高级模式匹配
# 只在包含"config"的行中替换
sed '/config/s/enabled/disabled/' file.txt
# 除了第1-10行外的所有行执行替换
sed '1,10!s/old/new/g' file.txt
# 使用分组和反向引用
echo "hello world" | sed 's/\(hello\) \(world\)/\2 \1/'
# 输出:world hello
sed地址范围
| 地址 |
说明 |
示例 |
n |
第n行 |
5s/old/new/ |
$ |
最后一行 |
$d |
n,m |
第n到m行 |
2,5p |
/pattern/ |
匹配模式的行 |
/error/d |
n,+m |
第n行及后面m行 |
5,+3p |
n~m |
从第n行开始,每m行 |
1~2p(奇数行) |
注意:
- 使用
-i选项前最好先测试命令,或者使用-i.bak创建备份
- sed默认不会修改原文件,除非使用
-i选项
- 正则表达式中的特殊字符需要使用反斜杠转义
- 在MacOS中,sed的
-i选项语法略有不同
- 对于大型文件,sed比大多数文本编辑器更高效
sed标志说明
g - 全局替换(一行中的所有匹配)
p - 打印替换后的行
w 文件 - 将结果写入文件
i - 忽略大小写
数字 - 替换第N个匹配
e - 执行替换命令中的shell命令
相关命令
awk - 更强大的文本处理工具
grep - 文本搜索工具
cut - 列提取工具
tr - 字符转换工具
perl - Perl编程语言,强大的文本处理
vim - 交互式文本编辑器