Linux sed 命令不完全指南

scoporscopor
2 min read

Linux Sed 命令不完全指南

1. sed 简介

1.1 什么是 Sed?

sed (Stream Editor) 是 Linux 和 Unix 系统中一个强大的文本处理工具,主要用于对文本进行自动编辑、替换、删除、插入等操作。它可以处理标准输入、文件或管道传输的文本流。

1.2 sed 的基本工作原理

sed 通过逐行读取输入文本,根据预定义的规则进行处理,然后输出结果。其核心是一种模式-动作(pattern-action)处理模型。

2. sed 基本语法

2.1 基本命令格式

sed [options] 'command' input_file

2.2 常用选项

  • -n:静默模式,只输出匹配的行
  • -i:直接修改源文件
  • -e:指定多个编辑命令
  • -f:从文件读取 sed 脚本

3. sed 基本命令详解

3.1 替换命令 (s)

# 基本替换
sed 's/old/new/' file.txt

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

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

# 区分大小写替换
sed 's/old/new/gi' file.txt

3.2 插入命令 (i)

# 在第2行前插入文本
sed '2i\New Line' file.txt

# 在匹配模式前插入
sed '/pattern/i\Inserted Line' file.txt

3.3 追加命令 (a)

# 在第2行后追加文本
sed '2a\Appended Line' file.txt

# 在匹配模式后追加
sed '/pattern/a\Appended Line' file.txt

3.4 删除命令 (d)

# 删除特定行
sed '3d' file.txt

# 删除匹配模式的行
sed '/pattern/d' file.txt

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

3.5 打印命令 (p)

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

# 打印匹配模式的行
sed -n '/pattern/p' file.txt

3.6 替换详细说明

直接修改文件(-i 选项)

# 直接修改源文件(实际改变文件内容)
sed -i 's/old/new/g' file.txt

仅显示替换结果(不修改源文件)

# 只输出替换结果,不改变源文件
sed 's/old/new/g' file.txt

# 保存到新文件
sed 's/old/new/g' file.txt > new_file.txt

替换演示

# 原文件:test.txt
# 内容:Hello world
# 执行 sed 's/world/linux/' test.txt

# 不带 -i:只会输出 "Hello linux",原文件不变
# 带 -i:原文件内容变为 "Hello linux"

重要注意事项

  • 不带 -ised 命令默认只输出结果
  • -i 选项会直接修改源文件
  • 建议使用 -i.bak 创建备份文件
    # 创建备份文件
    sed -i.bak 's/old/new/g' file.txt
    # 生成 file.txt 和 file.txt.bak
    

4. 行选择与过滤

4.1 选择特定行

# 显示第1-5行
sed -n '1,5p' file.txt

# 显示所有包含模式的行
sed -n '/pattern/p' file.txt

4.2 复杂行选择

# 从第10行到最后
sed -n '10,$p' file.txt

# 选择奇数行
sed -n '1~2p' file.txt

5. 正则表达式

5.1 基础正则匹配

# 匹配以数字开头的行
sed -n '/^[0-9]/p' file.txt

# 匹配电子邮件
sed -n '/^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/p' file.txt

5.2 高级正则替换

# 捕获组替换
sed 's/\([0-9]\+\)x\([0-9]\+\)/\2*\1/' file.txt

6. 高级 sed 脚本

6.1 多命令处理

sed -e '1d' -e 's/old/new/g' file.txt

6.2 使用 sed 脚本文件

# script.sed
1d
s/old/new/g

# 使用脚本
sed -f script.sed file.txt

7. 实战案例

7.1 日志处理

# 提取时间戳
cat access.log | sed -n 's/.*\[\(.*\)\].*/\1/p'

# 过滤错误日志
sed -n '/ERROR/p' application.log

7.2 批量文件处理

# 批量替换多个文件
find . -type f -name "*.txt" -exec sed -i 's/old/new/g' {} \;

8. 性能与注意事项

  • 对大文件使用 -i 选项时要谨慎
  • 复杂替换优先考虑使用 awk 或 perl
  • 使用 \(\) 进行分组与引用
  • 正则表达式要转义特殊字符

9. 常见陷阱与解决方案

  1. 转义特殊字符
  2. 使用不同分隔符
  3. 处理包含斜杠的文本

结语

sed 是文本处理的瑞士军刀,掌握它需要大量实践和对正则表达式的深入理解。

0
Subscribe to my newsletter

Read articles from scopor directly inside your inbox. Subscribe to the newsletter, and don't miss out.

Written by

scopor
scopor