Linux常用命令学习笔记:sed

1. 命令概述

  • 命令名称sed(英文全拼:stream editor)
  • 核心功能流编辑器,对文本进行流式处理
  • 主要用途:文本替换、删除、插入、打印等操作
  • 特点:非交互式、支持正则表达式、高效处理大文件

2. 语法格式

sed [选项] '命令' 文件...
sed [选项] -f 脚本文件 文件...

3. 常用选项

选项说明
-n只显示处理后的行
-e执行多个编辑命令
-f从脚本文件读取命令
-i直接修改文件内容
-r使用扩展正则表达式
--help显示帮助信息
--version显示版本信息

4. 基本操作

(1) 基本替换

# 替换每行的第一个匹配项
sed 's/old/new/' file.txt

# 替换所有匹配项
sed 's/old/new/g' file.txt

# 替换第2个匹配项
sed 's/old/new/2' file.txt

# 替换第2到第4个匹配项
sed 's/old/new/2,4' file.txt

(2) 指定行范围

# 替换第5行的内容
sed '5s/old/new/' file.txt

# 替换第5到第10行的内容
sed '5,10s/old/new/' file.txt

# 替换第5行到文件末尾的内容
sed '5,$s/old/new/' file.txt

# 替换包含"pattern"的行
sed '/pattern/s/old/new/' file.txt

# 替换不包含"pattern"的行
sed '/pattern/!s/old/new/' file.txt

(3) 删除行

# 删除第5行
sed '5d' file.txt

# 删除第5到第10行
sed '5,10d' file.txt

# 删除包含"pattern"的行
sed '/pattern/d' file.txt

# 删除空行
sed '/^$/d' file.txt

# 删除注释行
sed '/^#/d' file.txt

(4) 插入和追加

# 在第5行前插入文本
sed '5i\插入的文本' file.txt

# 在第5行后追加文本
sed '5a\追加的文本' file.txt

# 在文件开头插入文本
sed '1i\开头的文本' file.txt

# 在文件末尾追加文本
sed '$a\结尾的文本' file.txt

(5) 打印行

# 打印第5行
sed -n '5p' file.txt

# 打印第5到第10行
sed -n '5,10p' file.txt

# 打印包含"pattern"的行
sed -n '/pattern/p' file.txt

# 打印不包含"pattern"的行
sed -n '/pattern/!p' file.txt

5. 常用实例详解

(1) 文本替换

# 替换所有"old"为"new"
sed 's/old/new/g' file.txt

# 替换每行的第一个"old"
sed 's/old/new/' file.txt

# 替换第2个"old"
sed 's/old/new/2' file.txt

# 替换第2到第4个"old"
sed 's/old/new/2,4' file.txt

# 替换第5行的"old"
sed '5s/old/new/' file.txt

# 替换第5到第10行的"old"
sed '5,10s/old/new/' file.txt

# 替换包含"pattern"的行中的"old"
sed '/pattern/s/old/new/' file.txt

# 替换不包含"pattern"的行中的"old"
sed '/pattern/!s/old/new/' file.txt

(2) 删除操作

# 删除第5行
sed '5d' file.txt

# 删除第5到第10行
sed '5,10d' file.txt

# 删除包含"pattern"的行
sed '/pattern/d' file.txt

# 删除空行
sed '/^$/d' file.txt

# 删除注释行
sed '/^#/d' file.txt

# 删除以空格开头的行
sed '/^[[:space:]]*$/d' file.txt

# 删除包含数字的行
sed '/[0-9]/d' file.txt

(3) 插入和追加

# 在第5行前插入文本
sed '5i\插入的文本' file.txt

# 在第5行后追加文本
sed '5a\追加的文本' file.txt

# 在文件开头插入文本
sed '1i\开头的文本' file.txt

# 在文件末尾追加文本
sed '$a\结尾的文本' file.txt

# 在包含"pattern"的行前插入
sed '/pattern/i\插入的文本' file.txt

# 在包含"pattern"的行后追加
sed '/pattern/a\追加的文本' file.txt

(4) 打印操作

# 打印第5行
sed -n '5p' file.txt

# 打印第5到第10行
sed -n '5,10p' file.txt

# 打印包含"pattern"的行
sed -n '/pattern/p' file.txt

# 打印不包含"pattern"的行
sed -n '/pattern/!p' file.txt

# 打印奇数行
sed -n '1~2p' file.txt

# 打印偶数行
sed -n '2~2p' file.txt

# 打印最后一行
sed -n '$p' file.txt

(5) 其他操作

# 转换大小写
sed 's/[a-z]/\U&/g' file.txt  # 小写转大写
sed 's/[A-Z]/\L&/g' file.txt  # 大写转小写

# 添加行号
sed = file.txt | sed 'N;s/\n/\t/'

# 删除行号
sed 's/^[0-9]*\t//' file.txt

# 合并连续空行
sed '/^$/{N;/^\n$/D}' file.txt

# 删除行尾空格
sed 's/[[:space:]]*$//' file.txt

# 删除行首空格
sed 's/^[[:space:]]*//' file.txt

6. 实际应用场景

场景一:配置文件处理

# 修改nginx配置文件
sed -i 's/listen 80;/listen 8080;/' /etc/nginx/nginx.conf

# 修改Apache配置文件
sed -i 's/AllowOverride None/AllowOverride All/' /etc/apache2/apache2.conf

# 修改SSH配置
sed -i 's/#PermitRootLogin yes/PermitRootLogin no/' /etc/ssh/sshd_config

# 修改系统时区
sed -i 's/^ZONE=.*/ZONE="Asia\/Shanghai"/' /etc/sysconfig/clock

场景二:日志处理

# 提取错误日志
sed -n '/ERROR/p' app.log

# 提取特定时间段的日志
sed -n '/2023-12-19 1[0-9]:/p' access.log

# 提取IP地址
sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' access.log

# 提取HTTP状态码
sed -n 's/.* \([2-5][0-9]\{2\}\) .*/\1/p' access.log

# 删除空行和注释行
sed -i '/^$/d;/^#/d' config.conf

场景三:代码处理

# 替换Python文件中的字符串
sed -i 's/old_function/new_function/g' *.py

# 替换C语言文件中的字符串
sed -i 's/old_variable/new_variable/g' *.c

# 替换Shell脚本中的路径
sed -i 's/\/old\/path/\/new\/path/g' *.sh

# 删除TODO注释
sed -i '/TODO/d' *.py

# 添加文件头注释
sed -i '1i\# -*- coding: utf-8 -*-' *.py

场景四:文本格式化

# 删除行尾空格
sed -i 's/[[:space:]]*$//' file.txt

# 删除行首空格
sed -i 's/^[[:space:]]*//' file.txt

# 删除空行
sed -i '/^$/d' file.txt

# 合并连续空行
sed -i '/^$/{N;/^\n$/D}' file.txt

# 添加行号
sed = file.txt | sed 'N;s/\n/\t/' > numbered.txt

# 转换行尾符(DOS转Unix)
sed -i 's/\r$//' file.txt

# 转换行尾符(Unix转DOS)
sed -i 's/$/\r/' file.txt

7. 与其他命令的区别

命令特点适用场景
sed流编辑器,支持正则表达式文本替换、删除、插入
awk文本处理工具,支持字段处理复杂文本处理、报表生成
grep文本搜索工具模式匹配、搜索
cut按列提取文本提取指定列
tr字符转换工具字符替换、删除

8. 注意事项

  1. 正则表达式sed使用基本正则表达式,部分元字符需要转义
  2. 文件修改:使用 -i选项直接修改文件,建议先备份
  3. 性能优化:使用更精确的模式可以提高处理速度
  4. 多命令执行:使用 -e选项执行多个命令,或用分号分隔
  5. 脚本文件:使用 -f选项从文件读取命令

9. 常见问题解决

(1) 特殊字符转义

# 替换包含"/"的字符串
sed 's/\/old\/path/\/new\/path/g' file.txt

# 或者使用其他分隔符
sed 's|/old/path|/new/path|g' file.txt

# 替换包含"&"的字符串
sed 's/old\&new/old_and_new/g' file.txt

# 替换包含"+"的字符串
sed 's/old\+/old_plus/g' file.txt

# 替换包含"?"的字符串
sed 's/old\?/old_question/g' file.txt

(2) 性能优化

# 使用更精确的模式
sed 's/^old/new/' file.txt  # 比 's/old/new/' 更快

# 使用地址范围
sed '5,10s/old/new/' file.txt  # 只处理指定行

# 使用条件匹配
sed '/pattern/s/old/new/' file.txt  # 只处理匹配的行

(3) 大文件处理

# 分块处理大文件
split -l 1000 largefile.txt chunk_
for chunk in chunk_*; do
    sed 's/old/new/g' "$chunk" > "${chunk}_new"
done

# 或者使用其他工具
awk '{gsub(/old/, "new"); print}' largefile.txt > newfile.txt

(4) 多文件处理

# 批量处理多个文件
for file in *.txt; do
    sed -i 's/old/new/g' "$file"
done

# 批量处理目录下的文件
find /path/to/dir -name "*.txt" -exec sed -i 's/old/new/g' {} \;

# 批量处理并备份
for file in *.txt; do
    cp "$file" "${file}.bak"
    sed 's/old/new/g' "$file" > "${file}.new"
done

核心要点总结

  • sed是强大的流编辑器,支持正则表达式
  • 常用选项-n(只显示处理后的行)、-i(直接修改文件)、-e(执行多个命令)
  • 基本操作:替换(s)、删除(d)、插入(i)、追加(a)、打印(p)
  • 实际应用:配置文件处理、日志处理、代码处理、文本格式化
  • 注意事项:特殊字符需要转义,使用 -i前建议备份文件

sed命令是Linux系统管理员和开发者的必备工具,熟练掌握可以大大提高文本处理效率。


作 者:南烛
链 接:https://www.itnotes.top/archives/399
来 源:IT笔记
文章版权归作者所有,转载请注明出处!


上一篇
下一篇