sed命令

4 阅读3分钟

sed(Stream Editor)是 Linux/Unix 系统中强大的文本处理工具,擅长对文本进行替换、删除、插入、追加等操作。它逐行处理输入数据,高效且灵活,广泛用于日志处理、脚本自动化和数据清洗。以下是系统的 sed 学习指南:

一、基本语法

sed [选项] '命令' [输入文件]
  • 选项:常用 -i(直接修改文件)、-e(执行多个命令)、-n(静默模式,需配合 p 命令显式打印)。

  • 命令:由地址动作组成,格式为 [地址]动作

二、核心命令与动作

1. 替换命令 s


sed 's/原文本/新文本/修饰符'  # 替换每行第一个匹配项

sed 's/原文本/新文本/g'      # 替换每行所有匹配项(g=global)

sed 's/原文本/新文本/gi'     # 忽略大小写替换(i=ignore case)

sed 's/原文本/新文本/2'      # 替换每行的第2个匹配项

  • 示例:将 hello 替换为 hi
echo "hello world, hello sed" | sed 's/hello/hi/'     # 输出: hi world, hello sed
echo "hello world, hello sed" | sed 's/hello/hi/g'    # 输出: hi world, hi sed

2. 删除命令 d

sed '2d' file.txt        # 删除第2行
sed '2,5d' file.txt      # 删除第2到第5行
sed '/pattern/d' file.txt  # 删除包含pattern的行
sed '/^$/d' file.txt     # 删除空行(^$ 表示空行)

3. 插入与追加命令 ia

sed '2i 插入的文本' file.txt  # 在第2行前插入文本
sed '2a 追加的文本' file.txt  # 在第2行后追加文本
sed '/pattern/a 追加的文本' file.txt  # 在匹配行后追加文本

4. 修改命令 c

sed '2c 替换整行的文本' file.txt  # 将第2行替换为新文本
sed '/pattern/c 替换的文本' file.txt  # 将匹配行替换为新文本

5. 打印命令 p

需配合 -n 选项使用:

sed -n '2p' file.txt       # 只打印第2行
sed -n '/pattern/p' file.txt  # 只打印包含pattern的行
sed -n '2,5p' file.txt     # 只打印第2到第5行

三、地址定位

地址用于指定命令作用的行范围:

地址形式      说明                                                                
n           n 行(如 2d 删除第2行)                                      
n,m         n 到第 m 行(如 2,5d 删除第2到第5行)                     
$           最后一行(如 $d 删除最后一行)                                     
/pattern/   匹配正则表达式的行(如 /error/d 删除包含 error 的行)          
n,/pattern/ 从第 n 行到第一个匹配 pattern 的行(如 1,/start/p 打印第1行到首个 start 行)
0,/pattern/ 从第一行到第一个匹配 pattern 的行(与 1,/pattern/ 类似,但匹配行只处理一次)

四、高级用法

1. 分组与引用

使用 \(\) 分组,\1\2 引用分组内容:

echo "2025-05-27" | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/\3\/\2\/\1/'
# 输出: 27/05/2025

2. 多行处理

  • 替换跨行内容
sed ':a;N;$!ba; s/原文本/新文本/g' file.txt  # 合并所有行后替换
  • 删除包含特定字符串的段落(段落以空行分隔):
sed '/pattern/,/^$/d' file.txt  # 删除从pattern到下一个空行的内容

3. 原地修改文件

使用 -i 选项直接修改文件:

sed -i 's/old/new/g' file.txt  # 直接替换file.txt中的内容
sed -i.bak 's/old/new/g' file.txt  # 先备份为file.txt.bak,再修改原文件

4. 执行多个命令

使用 -e 或分号分隔多个命令:

sed -e 's/old/new/' -e 's/foo/bar/' file.txt
sed 's/old/new/; s/foo/bar/' file.txt

五、实战案例

1. 日志处理

  • 提取时间戳
cat access.log | sed -n 's/.*\[\(.*\)\].*/\1/p'
  • 删除注释行和空行
sed -i '/^#/d; /^$/d' config.ini

2. HTML/CSS处理

  • 添加DOCTYPE声明
sed '1i <!DOCTYPE html>' index.html
  • 替换CSS链接
sed 's/old.css/new.css/g' index.html

3. 数据清洗

  • 删除多余空格
sed 's/  */ /g' data.txt
  • 转换CSV为TSV
sed 's/,/\t/g' data.csv > data.tsv

六、常见陷阱与注意事项

  1. 正则表达式转义

   - 在 BRE 模式下,部分元字符(如 +?())需转义,或使用 -r 选项启用 ERE 模式。

  1. 引号问题

   - 单引号 ' 中不解析变量,需使用双引号 " 或混合使用:

old="apple"
new="banana"
sed "s/$old/$new/g" file.txt  # 正确
sed 's/'"$old"'/'"$new"'/g' file.txt  # 复杂情况
  1. 备份文件

   - 使用 -i 直接修改文件时,建议添加备份后缀(如 -i.bak)以防意外。

七、学习资源推荐

  1. 在线教程

   - GNU Sed 官方文档

   - Sed - An Introduction and Tutorial by Bruce Barnett

  1. 练习工具

   - Regex101:支持 sed 模式调试。

   - Sed 练习:在线练习 sed 命令。

掌握 sed 后,你可以高效处理各种文本编辑任务,避免手动操作的繁琐。多练习实际案例,逐渐熟悉其强大的文本处理能力!