当前位置: 首页 > ops >正文

Linux 文本处理神器——sed

文章目录

  • Linux 文本处理神器:sed 命令从入门到实战全指南
    • 一、认识 sed:它是什么,如何工作?
      • 1. sed 核心定位
      • 2. 必须理解的工作原理
    • 二、sed 命令基础:格式、选项与动作
      • 1. 两种核心命令格式
      • 2. 常用选项(新手必记)
      • 3. 核心动作指令(实现文本操作)
    • 三、sed 实战:从基础到进阶场景
      • 1. 筛选输出文本(`p` 动作 + `-n` 选项)
      • 2. 删除文本行(`d` 动作)
      • 3. 替换文本内容(`s` 动作,最常用)
      • 4. 迁移与追加文本(`H`/`G`/`w`/`r` 动作)
      • 5. 分组操作(`{}` 语法)
    • 四、生产环境实战案例
      • 案例1:批量修改网卡 IP 地址
      • 案例2:修改 Apache 服务配置
      • 案例3:编写 vsftpd 配置自动化脚本
    • 五、sed 学习总结与避坑指南
      • 1. 核心知识点回顾
      • 2. 避坑指南

Linux 文本处理神器:sed 命令从入门到实战全指南

在 Linux 系统管理和日常运维中,文本处理是高频需求——无论是修改配置文件、筛选日志内容,还是批量编辑数据,都离不开高效的工具。而 sed(Stream Editor,流编辑器) 作为其中的“元老级”工具,凭借其强大的脚本化编辑能力,成为处理文本的“瑞士军刀”。本文将从原理、基础用法到生产实战,带你彻底掌握 sed 命令。

一、认识 sed:它是什么,如何工作?

1. sed 核心定位

sed 是一款基于脚本的流编辑器,主要用于:

  • 自动编辑单个或多个文本文件;
  • 简化重复的文本处理操作(如批量替换配置项);
  • 编写文本转换程序(如日志格式标准化)。

它最大的特点是“逐行处理”——无需打开文件,即可通过指令对文本流进行高效操作。

2. 必须理解的工作原理

sed 的工作流程围绕 “模式空间”(临时缓冲区)展开,核心分为三步:读取 → 执行 → 显示,具体逻辑如下:

  1. 读取:从输入流(文件、管道、标准输入)中逐行读取内容,存入“模式空间”(清空原有数据);
  2. 执行:按预设指令顺序处理模式空间的内容。若指定了行地址(如“3-5行”“包含the的行”),仅对匹配行执行指令;未指定则对所有行执行;
  3. 显示:将处理后的内容输出到屏幕(默认),随后清空模式空间;
  4. 循环:重复上述步骤,直到所有行处理完毕。

⚠️ 关键注意点:默认情况下,sed 仅操作“模式空间”的临时数据,不会修改源文件!若需修改源文件,需用 -i 选项(直接编辑)或重定向(>,输出到新文件)。

二、sed 命令基础:格式、选项与动作

1. 两种核心命令格式

sed 的用法分为“直接指令”和“脚本文件”两种,按需选择:

  • 直接指定指令(简单场景):
    sed [选项] '操作' 文件名
    例:sed -n '3p' demo(显示 demo 文件第3行)
  • 调用脚本文件(复杂场景):
    sed [选项] -f 脚本文件 文件名
    例:sed -f edit.sed demo(执行 edit.sed 中的指令处理 demo)

2. 常用选项(新手必记)

选项用于控制 sed 的执行方式,以下是高频选项的功能说明:

选项核心功能实用场景
-n取消默认输出,仅显示处理后的结果配合 p(打印)动作,避免重复输出
-i直接编辑源文件(危险!建议加备份)批量修改配置文件,如 -i.bak 会生成原文件备份(file.bak
-r启用扩展正则表达式无需对 +?() 等元字符转义,简化正则编写
-e执行多个编辑指令一次执行多步操作,如 -e 's/a/A/' -e 's/b/B/'
-f读取脚本文件中的指令指令较多时,用脚本文件管理(如10+条操作)

3. 核心动作指令(实现文本操作)

“动作”是 sed 的“灵魂”,用于指定对文本的具体操作,格式为 [行地址]动作(行地址可选)。以下是最常用的动作:

动作功能描述示例
p打印匹配行内容3p(打印第3行)、/the/p(打印包含the的行)
d删除匹配行3,5d(删除第3-5行)、/^$/d(删除空行)
s字符串替换,格式 s/旧值/新值/选项s/the/THE/g(全局替换the为THE)、s/o//g(删除所有o)
a在匹配行下方插入内容3aNew Line(第3行后插“New Line”)
i在匹配行上方插入内容/the/iPrefix(包含the的行前插“Prefix”)
c用指定内容替换整行5cHello(第5行替换为“Hello”)

三、sed 实战:从基础到进阶场景

以下示例均以 demo 文件为操作对象,覆盖日常工作中最常用的文本处理需求。

1. 筛选输出文本(p 动作 + -n 选项)

核心需求:精准显示目标行,避免默认全量输出。

# 1. 显示第3行
sed -n '3p' demo# 2. 显示第3-5行
sed -n '3,5p' demo# 3. 显示所有奇数行(n 表示“读取下一行”,跳过偶数行)
sed -n 'p;n' demo# 4. 显示包含“the”的行
sed -n '/the/p' demo# 5. 显示以“PI”开头的行(^ 匹配行首)
sed -n '/^PI/p' demo# 6. 显示以数字结尾的行($ 匹配行尾)
sed -n '/[0-9]$/p' demo# 🌟 实际场景:提取 ifconfig ens33 的IP地址(结合正则)
ifconfig ens33 | sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'

2. 删除文本行(d 动作)

核心需求:删除不需要的行(如空行、注释行、特定内容行)。

# 1. 删除第3行
sed '3d' demo# 2. 删除第3-5行
sed '3,5d' demo# 3. 删除包含“cross”的行
sed '/cross/d' demo# 4. 删除以小写字母开头的行
sed '/^[a-z]/d' demo# 5. 删除所有空行(^$ 匹配空行)
sed '/^$/d' demo

3. 替换文本内容(s 动作,最常用)

核心需求:批量修改文本中的字符或字符串,支持全局替换、指定行替换等。

# 1. 每行第一个“the”替换为“THE”(默认替换第1个匹配项)
sed 's/the/THE/' demo# 2. 全局替换:所有“the”替换为“THE”(g 表示 global)
sed 's/the/THE/g' demo# 3. 第3-5行的“the”替换为“THE”
sed '3,5s/the/THE/g' demo# 4. 在每行行首插入“#”(注释行)
sed 's/^/#/' demo# 5. 在每行行尾插入“EOF”
sed 's/$/EOF/' demo# 🌟 实际场景:修改 SELinux 配置(启用 SELinux,备份原文件)
sed -i.bak 's/SELINUX=disabled/SELINUX=enforcing/' /etc/selinux/config

4. 迁移与追加文本(H/G/w/r 动作)

核心需求:移动文本位置、保存特定行到新文件、追加外部文件内容。

# 1. 将包含“the”的行移到文件末尾(H:复制到剪贴板;d:删原行;$G:末尾追加)
sed '/the/{H;d};$G' demo# 2. 将包含“the”的行保存到 out.file(w:写入文件)
sed '/the/w out.file' demo# 3. 将 /etc/hostname 的内容追加到包含“the”的行后(r:读取外部文件)
sed '/the/r /etc/hostname' demo# 4. 第3行后插入多行内容(\n 表示换行)
sed '3aNew1\nNew2\nNew3' demo

5. 分组操作({} 语法)

当需要对同一行执行多个指令时,用 {;} 分组,避免重复指定行地址:

# 对包含“root”的行,先替换“root”为“ROOT”,再替换“x”为“X”
sed '/root/{s/root/ROOT/;s/x/X/g}' /etc/passwd

四、生产环境实战案例

sed 的真正价值体现在批量处理和自动化脚本中,以下是三个典型生产场景。

案例1:批量修改网卡 IP 地址

需求:将 ens33 网卡的 IP 地址改为 192.168.10.100(配置文件路径:/etc/sysconfig/network-scripts/ifcfg-ens33

# 直接修改源文件(无备份,谨慎!需备份可加 -i.bak)
sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33

案例2:修改 Apache 服务配置

需求:将 Apache 监听地址改为 192.168.10.100,端口改为 8080(配置文件:/etc/httpd/conf/httpd.conf

# 1. 修改监听地址
sudo sed -i 's/^Listen .*/Listen 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf# 2. 修改 ServerName(与监听地址一致)
sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf

案例3:编写 vsftpd 配置自动化脚本

需求:禁止匿名登录,允许本地用户登录并支持写入,同时启动服务并设为开机自启。

# 创建脚本文件 local_only_ftp.sh
vim local_only_ftp.sh
#!/bin/bash
# 定义配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"# 备份原配置(仅当备份不存在时执行)
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak# 1. 禁用匿名登录(基于样本文件)
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG# 2. 启用本地用户登录和写入权限(多指令用 -e 分隔)
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG# 3. 若无 listen=YES,在文件末尾添加
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG# 4. 启动服务并设为开机自启
systemctl restart vsftpd
systemctl enable vsftpd# 赋予执行权限并运行
chmod +x local_only_ftp.sh
./local_only_ftp.sh

五、sed 学习总结与避坑指南

1. 核心知识点回顾

  • 工作流:逐行处理模式空间,默认不修改源文件;
  • 关键选项-n(精准输出)、-i(直接编辑)、-r(扩展正则);
  • 高频动作p(打印)、d(删除)、s(替换)、a/i(插入);
  • 实战技巧:复杂指令用脚本文件管理,多指令用分组或 -e 串联。

2. 避坑指南

  1. 使用 -i 前必备份:直接编辑源文件风险高,建议加备份后缀(如 -i.bak);
  2. 正则转义问题:未用 -r 时,+?() 等需加 \ 转义(如 \(abc\));
  3. 预览结果再执行:修改前先用 -n 预览效果(如 sed -n 's/the/THE/gp' demo),确认无误再用 -i
  4. 行地址格式:范围行用 n1,n2(如 3,5),匹配行用 /pattern/(如 /the/)。

sed 看似语法复杂,但掌握核心逻辑后,会发现它是“一劳永逸”的文本处理工具——无论是日常运维还是自动化脚本编写,都能大幅提升效率。建议从简单场景(如筛选行、替换字符)开始练习,逐步过渡到复杂脚本,很快就能熟练掌握!

http://www.xdnf.cn/news/19666.html

相关文章:

  • 拔河(蓝桥杯)(前缀和)
  • OpenStack:典型的面向服务架构(Service-Oriented Architecture, SOA)
  • milvus-standalone启动失败unhealthy,错误日志context deadline exceeded
  • 面试官常问:Redis 为什么快?这篇回答满分!
  • 【数据结构探秘】手把手用单链表实现增删查改:一篇面向 C 程序员的实战指南
  • C#枚举类型的定义及其用法
  • WS2812灯带效果设计器上位机
  • 微服务的编程测评系统19-我的消息功能-竞赛排名功能
  • ChartView的基本使用
  • 【学Python自动化】 7.1 Python 与 Rust 输入输出对比学习笔记
  • Linux系统shell脚本(二)
  • 【Python - 基础 - 工具】解决pycharm“No Python interpreter configured for the project”问题
  • 机器学习入门,支持向量机
  • Vite + React + Tailwind v4 正确配置指南(避免掉进 v3 的老坑)
  • 为什么程序员总是发现不了自己的Bug?
  • Flutter 3.35.2 主题颜色设置指南
  • 使用 qmake 生成 Makefile,Makefile 转换为 Qt 的 .pro 文件
  • Redis核心数据类型解析——string篇
  • 基于YOLO8的番茄成熟度检测系统(数据集+源码+文章)
  • 2025年女性最实用的IT行业证书推荐:赋能职业发展的8大选择
  • Elasticsearch面试精讲 Day 5:倒排索引原理与实现
  • IoTDB对比传统数据库的五大核心优势
  • 深度估计:单目视觉实现车距测量和车速估计(含完整项目代码)
  • ubantu20.04 git clone 无法连接问题与解决方法
  • netstat用法
  • 别再让分散 IO 拖慢性能!struct iovec:高效处理聚集 IO 的底层利器
  • pikachu之 unsafe upfileupload (不安全的文件上传漏洞)
  • 力扣hot100:除自身以外数组的乘积(除法思路和左右前缀乘积)(238)
  • 毕业项目推荐:70-基于yolov8/yolov5/yolo11的苹果成熟度检测识别系统(Python+卷积神经网络)
  • 【无人机三维路径规划】基于遗传算法GA结合粒子群算法PSO无人机复杂环境避障三维路径规划(含GA和PSO对比)研究