Linux sed 命令详解 – 文本处理神器
简介
sed(Stream Editor)是 Linux/Unix 系统中强大的文本处理工具,用于对文本进行替换、删除、插入等操作。它通常用于批量处理文件中的文本,是系统管理员和开发者的必备技能。
基本语法
sed [选项] '命令' 文件名
常用选项
| 选项 | 说明 |
|---|---|
-n |
抑制自动打印模式空间 |
-i |
直接修改文件内容 |
-e |
添加多个编辑命令 |
-f |
从文件读取编辑命令 |
-r |
使用扩展正则表达式 |
常见用法
1. 替换文本
基本替换
# 将文件中所有的 "old" 替换为 "new"
sed -i 's/old/new/' file.txt
全局替换
# 替换每一行中所有的匹配
sed -i 's/old/new/g' file.txt
指定行替换
# 替换第 3 行的内容
sed -i '3s/old/new/' file.txt
# 替换第 1-5 行的内容
sed -i '1,5s/old/new/' file.txt
# 替换包含 "keyword" 的行
sed -i '/keyword/s/old/new/' file.txt
多个替换
# 同时替换多个不同的内容
sed -i -e 's/old1/new1/g' -e 's/old2/new2/g' file.txt
2. 删除行
# 删除第 5 行
sed -i '5d' file.txt
# 删除第 1-3 行
sed -i '1,3d' file.txt
# 删除最后一行
sed -i '$d' file.txt
# 删除空行
sed -i '/^$/d' file.txt
# 删除以 "#" 开头的行(注释行)
sed -i '/^#/d' file.txt
# 删除包含 "keyword" 的行
sed -i '/keyword/d' file.txt
3. 插入和追加
# 在第 3 行前插入新行
sed -i '3i\新插入的内容' file.txt
# 在第 3 行后追加新行
sed -i '3a\新追加的内容' file.txt
# 在文件开头插入
sed -i '1i\文件头部内容' file.txt
# 在文件末尾追加
sed -i '$a\文件末尾内容' file.txt
4. 打印特定行
# 打印第 5 行
sed -n '5p' file.txt
# 打印第 1-3 行
sed -n '1,3p' file.txt
# 打印包含 "keyword" 的行
sed -n '/keyword/p' file.txt
5. 进阶用法
替换变量中的内容
# 使用 shell 变量
old="old_value"
new="new_value"
sed "s/$old/$new/g" file.txt
忽略大小写
# 忽略大小写进行替换
sed -i 's/old/new/gi' file.txt
使用正则表达式
# 替换数字
sed 's/[0-9]+/NUM/g' file.txt
# 替换 IP 地址
sed 's/[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}/IP_ADDR/g' file.txt
# 替换邮箱地址
sed 's/[a-zA-Z0-9._%+-]\+@[a-zA-Z0-9.-]\+\.[a-zA-Z]\{2,\}/EMAIL/g' file.txt
多个命令组合
# 使用 -e 组合多个命令
sed -i -e 's/old1/new1/g' -e 's/old2/new2/g' -e '5d' file.txt
# 使用分号组合
sed -i 's/old1/new1/g; s/old2/new2/g; 5d' file.txt
备份并修改文件
# 修改前先备份
sed -i.bak 's/old/new/g' file.txt
# 这会创建 file.txt.bak 备份文件
实用示例
示例 1:批量重命名文件
# 将所有 .txt 文件中的 "old" 替换为 "new"
for file in *.txt; do
sed 's/old/new/g' "$file" > "new_$file"
done
示例 2:修改配置文件
# 修改 Nginx 配置文件中的端口
sed -i 's/listen 80/listen 8080/' /etc/nginx/nginx.conf
# 修改 MySQL 配置文件
sed -i 's/max_connections = 100/max_connections = 200/' /etc/mysql/my.cnf
示例 3:清理日志
# 删除空行
sed -i '/^$/d' application.log
# 删除指定日期之前的日志
sed -i '/2024-01-01/d' application.log
示例 4:提取文件内容
# 提取 IP 地址
ip addr | sed -n '/inet /p' | sed 's/inet \([0-9.]*\).*/\1/'
# 提取文件第 10-20 行
sed -n '10,20p' config.txt
示例 5:格式化输出
# 添加行号
sed = file.txt | sed 'N;s/\n/\t/'
# 转换为大写
sed 's/.*/\U&/' file.txt
# 转换为小写
sed 's/.*/\L&/' file.txt
示例 6:处理 CSV 文件
# 替换 CSV 中的分隔符
sed -i 's/,/;/g' data.csv
# 删除 CSV 中的空字段
sed -i 's/,,/;/g' data.csv
示例 7:日志分析
# 提取错误日志
grep -i error app.log | sed 's/\[.*\] //'
# 统计访问日志中的 IP
access.log | sed 's/ - - .*/\1/' | sort | uniq -c
示例 8:文本添加引号
# 为每行添加引号
sed 's/.*/"&"/' file.txt
# 为每行添加单引号
sed "s/.*/'&'/" file.txt
高级技巧
使用 & 匹配内容
# 为匹配的内容添加括号
echo "hello world" | sed 's/hello/(&)/'
# 输出: (hello) world
使用正则分组
# 交换两个词的位置
echo "hello world" | sed 's/\(hello\) \(world\)/\2 \1/'
# 输出: world hello
# 提取并重组
sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3\/\2\001/' date.txt
条件处理
# 如果行中包含 "A",则替换 "B" 为 "C"
sed '/A/s/B/C/' file.txt
多行处理
# 合并多行(将换行符替换为空格)
sed ':a;N;$!ba;s/\n/ /g' file.txt
# 删除空行
sed '/^$/d' file.txt
常见错误及解决
问题 1:特殊字符处理
# 错误写法(特殊字符需要转义)
sed 's/$var/new/' file.txt
# 正确写法(使用双引号或转义)
sed "s/$var/new/" file.txt
sed 's/\$var/new/' file.txt
问题 2:sed -i 不生效
# 检查文件权限
ls -l file.txt
# 使用 sudo(如果需要)
sudo sed -i 's/old/new/' /etc/file
问题 3:正则表达式不匹配
# 使用 -r 启用扩展正则
sed -r 's/[0-9]+/NUM/g' file.txt
性能优化
批量处理大文件
# 使用内存缓冲区
sed '500,1000s/old/new/' largefile.txt
# 分割处理
split -l 1000 largefile.txt chunk_
for f in chunk_*; do sed -i 's/old/new/g' "$f"; done
cat chunk_* > result.txt
并行处理
# 使用 xargs 并行处理
find . -name "*.txt" | xargs -P 4 -I {} sed -i 's/old/new/g' {}
总结
sed 是 Linux 文本处理的利器,掌握以上用法可以大大提高工作效率。建议:
- 熟记基本语法和常用选项
- 多练习实际案例
- 灵活组合多个命令
- 注意备份原文件(使用
-i.bak) - 善用正则表达式提高匹配精度
熟能生巧,多用多练就能熟练掌握这个强大的文本处理工具!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END














暂无评论内容