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

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://I4e99BHc.bqxxq.cn
http://h0G41auf.bqxxq.cn
http://HrbI5Mk8.bqxxq.cn
http://9KhOwpTS.bqxxq.cn
http://3jvkv2ny.bqxxq.cn
http://udf7VscN.bqxxq.cn
http://PJi7ZL3L.bqxxq.cn
http://b53xLJu2.bqxxq.cn
http://pmyNlD8E.bqxxq.cn
http://vHkhrZf3.bqxxq.cn
http://WEiiuCr0.bqxxq.cn
http://Tu60gfyt.bqxxq.cn
http://lrGetT3g.bqxxq.cn
http://Hufi8K5I.bqxxq.cn
http://dWcY13r3.bqxxq.cn
http://SDPmxvQj.bqxxq.cn
http://ko298LCr.bqxxq.cn
http://fncC0FDu.bqxxq.cn
http://BhSHLKZc.bqxxq.cn
http://uhy4Pojs.bqxxq.cn
http://aGRfdcHG.bqxxq.cn
http://eP9qfQjR.bqxxq.cn
http://Or7YA8az.bqxxq.cn
http://TMM5JpzX.bqxxq.cn
http://tfbMRumY.bqxxq.cn
http://f9TRmsZi.bqxxq.cn
http://ZikpoUXr.bqxxq.cn
http://tI7K4ORK.bqxxq.cn
http://GMyzSfG0.bqxxq.cn
http://dHaNCvor.bqxxq.cn
http://www.dtcms.com/a/363212.html

相关文章:

  • 手写Muduo网络库核心代码2--Poller、EPollPoller详细讲解
  • 《WINDOWS 环境下32位汇编语言程序设计》第10章 内存管理和文件操作(2)
  • Laravel 权限控制新选择:使用 Laravel-authz 集成 PHP-Casbin
  • IEEE 802.11 MAC架构解析:DCF与HCF如何塑造现代Wi-Fi网络?
  • 从实操到原理:一文搞懂 Docker、Tomcat 与 k8s 的关系(附踩坑指南 + 段子解疑)
  • 避坑指南!解决Navicat运行SQL成功但没有表的问题
  • 当AI“读懂”你的心:NLP如何让机器拥有真正的“语言智能”?
  • 最大熵强化学习相比传统强化学习,有什么缺点?
  • 固定资产管理系统(蓝牙标签打印+移动端Java+Vue+Uniapp源码)
  • 美团龙猫(longcat.AI)编写的利用二分查找优化Excel的sheet.xml指定范围输出C程序
  • 华清远见25072班I/O学习day3
  • 安装部署k3s
  • MySQL 8.0 窗口函数详解:让数据分析更简单高效
  • 核心理念:用“图像序列 + 光流插帧”降低硬件需求
  • UNet改进(37):AxialDynamicConv2D原理剖析与实战应用
  • GoLand IDE 无法识别 Go 工作区中的引用,如何解决?
  • 解决方法:QT打开正常的以前旧版本项目运行却报错的原因和解决方法
  • 猫头虎AI分享:无需OCR,基于ColQwen2、Qwen2.5和Weaviate对PDF进行多模态RAG的解决方案
  • Suno AI 新功能上线:照片也能唱歌啦!
  • 【GPT入门】第64课 Ilamaindex初步认识与llm幻觉解决方法
  • 高效对象属性复制工具
  • WEWA、VLA、世界模型,辅助驾驶进入GPT时代
  • 使用 Gulp + Webpack 打造一个完整的 TypeScript 库构建流程
  • STL库——deque/priority_queue
  • Mysql安全之 TDE ,列加密,审计日志
  • SpringCloud(6)-优雅实现远程调用-OpenFeign
  • 基于springboot的“衣依”服装销售平台
  • git通过https和SSH上传gitee仓库
  • MongoDb(①免安装)
  • ​​​​​​​Blender 重拓扑修改器实战指南:从基础操作到细节优化​