Linux 命令:sed

发布于:2025-06-22 ⋅ 阅读:(12) ⋅ 点赞:(0)

概述

  • sed命令的详细教程,涵盖进阶用法、正则表达式、特殊场景及常见示例
  • 资料已经分类整理好:https://pan.quark.cn/s/26d73f7dd8a7

1. 基本概念与语法

sed(Stream Editor)是行编辑器,逐行处理文本并输出结果,默认不修改原文件。

核心语法

sed [选项] '命令' 输入文件

常用选项

选项 作用
-n 静默模式,只输出被处理的行
-i 直接修改原文件(危险!建议先备份)
-e 允许多个编辑命令串联执行
-f 指定脚本文件执行命令
-r 使用扩展正则表达式(简化复杂模式)

2. 常用编辑命令

2.1 替换命令 s
sed 's/原文本/替换文本/标志' 文件

标志参数

  • g:全局替换(默认只替换每行第一个匹配)
  • 数字:替换第N个匹配(如3表示替换每行第3个匹配)
  • p:打印替换后的行(需配合-n使用)
  • w 文件名:将替换结果写入新文件

示例

# 替换每行第一个 "apple" 为 "banana"
sed 's/apple/banana/' fruits.txt

# 全局替换所有 "apple" 为 "banana"
sed 's/apple/banana/g' fruits.txt

# 仅替换第3行的 "apple" 为 "banana"
sed '3s/apple/banana/' fruits.txt

# 替换第2行到第5行的 "apple" 为 "banana"
sed '2,5s/apple/banana/' fruits.txt

# 替换每行第2个 "apple" 为 "banana"
sed 's/apple/banana/2' fruits.txt

# 替换所有 "apple" 并保存到新文件
sed 's/apple/banana/g' fruits.txt > new_fruits.txt

# 直接修改原文件(危险!)
sed -i 's/apple/banana/g' fruits.txt
2.2 删除命令 d
sed '行号或范围d' 文件

示例

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

# 删除第2行到第8行
sed '2,8d' data.txt

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

# 删除包含 "error" 的行
sed '/error/d' logs.txt

# 删除以 "#" 开头的注释行
sed '/^#/d' config.ini
2.3 打印命令 p

需配合-n选项使用,否则会输出所有行:

sed -n '行号或范围p' 文件

示例

# 打印第10行
sed -n '10p' large_file.txt

# 打印第5行到第15行
sed -n '5,15p' large_file.txt

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

# 打印以 "user:" 开头的行
sed -n '/^user:/p' auth.log
2.4 插入与追加命令
  • i:在指定行前插入内容
  • a:在指定行后追加内容

示例

# 在第1行前插入 "Header:"
sed '1i\Header:' data.txt

# 在包含 "Section" 的行后追加 "Subsection:"
sed '/Section/a\Subsection:' document.txt

# 在空行后追加 "New line"
sed '/^$/a\New line' empty_lines.txt

3. 高级用法

3.1 正则表达式(基础)

sed默认使用基本正则表达式(BRE),部分元字符需转义:

  • ^:行首
  • $:行尾
  • .:匹配任意单个字符
  • *:匹配前一个字符0次或多次
  • []:匹配括号内任意字符
  • \(\):分组
  • \|:或(需转义为\|

示例

# 删除所有以数字开头的行
sed '/^[0-9]/d' data.txt

# 将所有以 "www." 开头的域名替换为 "https://www."
sed 's/^www\./https:\/\/www./' urls.txt

# 提取IP地址(简化版)
sed -n 's/.*\([0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}\).*/\1/p' logs.txt
3.2 扩展正则表达式(-r选项)

使用-r选项后,无需转义元字符:

  • +:匹配前一个字符1次或多次
  • ?:匹配前一个字符0次或1次
  • ():分组
  • |:或

示例

# 匹配 email 地址(简化版)
sed -r -n 's/.*([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}).*/\1/p' contacts.txt

# 将 "color" 或 "colour" 统一替换为 "color"
sed -r 's/colou?r/color/g' document.txt
3.3 引用变量

在脚本中使用变量时,需用双引号包裹命令:

old="apple"
new="banana"
sed "s/$old/$new/g" fruits.txt
3.4 多行处理
  • N:将下一行追加到模式空间
  • D:删除模式空间的第一行
  • P:打印模式空间的第一行

示例:合并连续的空行为一个空行:

sed '/^$/{N;/^\n$/D}' file.txt

4. 特殊场景示例

4.1 修改配置文件
# 将 /etc/hosts 中的 localhost 注释取消
sed -i '/localhost/s/^#//' /etc/hosts

# 修改 MySQL 配置中的端口号
sed -i 's/port = 3306/port = 3307/g' /etc/mysql/my.cnf
4.2 文本格式化
# 给每行添加行号
sed = file.txt | sed 'N;s/\n/ /'

# 将逗号分隔的 CSV 转为制表符分隔
sed 's/,/\t/g' data.csv
4.3 批量重命名文件
# 将所有 .txt 文件重命名为 .text
ls *.txt | sed 's/\(.*\)\.txt/mv & \1.text/' | sh

5. 常见问题与技巧

  1. 处理包含斜杠的路径

    # 使用其他分隔符(如`#`)
    sed 's#/old/path#/new/path#g' config.conf
    
  2. 保留原文件备份

    sed -i.bak 's/old/new/g' file.txt  # 会生成 file.txt.bak
    
  3. 同时执行多个命令

    sed -e 's/old/new/' -e '/delete/d' file.txt
    
  4. 复杂脚本
    创建script.sed文件:

    s/hello/hi/g
    /error/d
    1i\This is a header
    

    执行:

    sed -f script.sed input.txt
    

6. 总结

sed是强大的文本处理工具,适合自动化修改、提取和转换文本。核心是掌握:

  • 替换命令s/原文本/新文本/标志
  • 删除命令d
  • 打印命令p(配合-n
  • 正则表达式:基础与扩展语法
  • 安全操作:避免直接修改原文件(先备份或用-i.bak

通过组合不同命令和正则表达式,sed可以高效处理各种文本处理任务。


网站公告

今日签到

点亮在社区的每一天
去签到