Linux sed 命令详解 – 文本处理神器

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 文本处理的利器,掌握以上用法可以大大提高工作效率。建议:

  1. 熟记基本语法和常用选项
  2. 多练习实际案例
  3. 灵活组合多个命令
  4. 注意备份原文件(使用 -i.bak
  5. 善用正则表达式提高匹配精度

熟能生巧,多用多练就能熟练掌握这个强大的文本处理工具!

© 版权声明
THE END
喜欢就支持一下吧
点赞12 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容