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

从入门到实战:Linux sed命令全攻略,文本处理效率翻倍

从入门到实战:Linux sed命令全攻略,文本处理效率翻倍

文章目录

  • 从入门到实战:Linux sed命令全攻略,文本处理效率翻倍
    • 一、认识sed:什么是流编辑器?
    • 二、吃透sed工作原理:为什么它能高效处理文本?
    • 三、sed基础用法:命令格式与核心选项
      • 3.1 核心选项解析
      • 3.2 核心操作指令
    • 四、sed实战演练:从基础到进阶案例
      • 4.1 文本查看:精准输出指定内容(p指令)
      • 4.2 文本删除:批量清理无用内容(d指令)
      • 4.3 文本替换:批量修改内容(s/c/y指令)
        • 4.3.1 s指令:字符串替换(最常用)
        • 4.3.2 c指令:整行替换
        • 4.3.3 y指令:字符转换(按位置一一对应)
      • 4.4 文本迁移:插入、追加与保存(a/i/w/r指令)
        • 4.4.1 插入/追加(i/a指令)
        • 4.4.2 保存/读取(w/r指令)
      • 4.5 多行处理:保留空间的应用(H/G指令)
      • 4.6 脚本批量处理:多指令集成(-f选项)
    • 五、生产环境实战:sed的高频应用场景
      • 5.1 修改网络配置:设置IP地址
      • 5.2 调整Apache配置:修改监听地址与端口
      • 5.3 配置vsftpd服务:禁止匿名登录
      • 5.4 提取网卡IP地址:结合管道与正则
    • 六、sed使用注意事项
    • 总结

在Linux系统中,文本处理是日常工作中绕不开的环节。无论是分析日志、修改配置文件,还是批量处理数据,都需要高效的文本编辑工具。sed命令作为一款流编辑器,凭借其强大的批量处理能力和灵活的脚本支持,成为了Linux运维、开发人员的必备工具。本文将从sed的基本概念出发,循序渐进讲解其原理、用法,并通过实战案例展示其在生产环境中的应用,助你轻松掌握这一高效文本处理利器。

一、认识sed:什么是流编辑器?

sed全称为“Stream Editor”(流编辑器),它与传统的交互式编辑器(如vi)不同,不直接打开文件进行交互式编辑,而是通过脚本指令对输入的文本流(文件、管道、标准输入等)进行逐行处理

其核心价值在于:

  • 自动化处理:可通过脚本实现重复、繁琐的文本编辑操作自动化,避免人工逐行修改的低效与失误。
  • 批量处理:支持同时处理单个或多个文件,轻松实现大规模文本的统一修改。
  • 管道集成:可与Linux其他命令(如grep、cat、ifconfig等)通过管道结合,构建强大的文本处理流水线。

二、吃透sed工作原理:为什么它能高效处理文本?

想要灵活运用sed,必须先理解其底层工作流程。sed的核心是“模式空间”(Pattern Space)——一个临时缓冲区,所有编辑操作都在其中进行,默认不会修改原文件(除非主动指定)。其完整工作流程可分为读取、执行、显示三个循环步骤:

  1. 读取(Read):从输入流中读取一行文本,存储到模式空间中,清空模式空间原有内容。
  2. 执行(Execute):按照指定的脚本指令,对模式空间中的文本进行匹配和编辑。若未指定行地址,指令将作用于所有行;若指定了行地址,仅匹配的行会被处理。
  3. 显示(Print):将模式空间中处理后的文本输出到输出流(默认是屏幕),随后清空模式空间。

重复以上三步,直到输入流中的所有行都处理完毕。

关键注意点:默认情况下,sed仅修改模式空间中的内容,原文件保持不变。若需修改原文件,需使用-i选项(建议先备份,如-i.bak会保留原文件为.bak备份)。

三、sed基础用法:命令格式与核心选项

sed的命令格式主要有两种,分别适用于简单指令和复杂脚本场景:

# 1. 直接指定指令处理文本
sed [选项] '操作' 文件名/输入流
# 2. 通过脚本文件处理文本(适用于多指令场景)
sed [选项] -f 脚本文件 文件名/输入流

3.1 核心选项解析

sed的选项用于控制处理方式,常用选项如下表所示:

选项英文全称功能说明
-e–expression允许在同一命令中指定多个编辑指令(多指令处理)
-n–quiet/silent取消默认输出(仅输出经过编辑指令处理后的内容)
-f–file从指定的脚本文件中读取编辑指令
-i–in-place直接修改原文件(危险!建议搭配备份,如-i.bak
-r/-E–regexp-extended使用扩展正则表达式(无需对`()、{}、
-s–separate将多个文件视为独立文件处理,而非连续的文本流
-h–help显示帮助信息

3.2 核心操作指令

sed的“操作”由“行地址”和“动作指令”组成,格式为[n1[,n2]]动作,其中n1,n2指定作用的行范围(可选),动作指定具体编辑操作。常用动作指令如下:

动作功能说明
p打印模式空间中的内容,常与-n搭配(避免重复输出)
d删除模式空间中的匹配行
s字符串替换,格式为s/被替换内容/替换内容/[选项](选项:g-全局替换;n-第n次匹配替换)
a在匹配行下方插入指定内容
i在匹配行上方插入指定内容
c用指定内容替换匹配的整行
y字符转换,格式为y/原字符集/目标字符集/(按位置一一对应转换)
H将匹配行复制到“保留空间”(临时缓存,用于多行处理)
G将保留空间的内容追加到模式空间
w将匹配行写入指定文件
r读取指定文件的内容,追加到匹配行之后

四、sed实战演练:从基础到进阶案例

以下案例均以demo文件为测试对象(内容如下),带你逐步掌握sed的核心用法:

1. Hello, the world!
2. This is a test file.
3. He was short and fat.
4. A wood cross!
5. PI=3.141592653589793238462643383249901429
6. Misfortunes never come alone/single.
7. 
8. linux is great!

4.1 文本查看:精准输出指定内容(p指令)

p指令用于打印文本,需配合-n选项(否则会重复输出默认内容),常用于筛选特定行或匹配内容。

案例命令说明
输出所有行sed -n 'p' demo等同于cat demo
输出第3行sed -n '3p' demo仅打印第3行
输出3-5行sed -n '3,5p' demo打印连续行(3到5行)
输出奇数行sed -n 'p;n' demon表示“读取下一行”,先打印当前行再读下一行,实现奇数行输出
输出偶数行sed -n 'n;p' demo先读下一行,再打印,实现偶数行输出
输出含“the”的行sed -n '/the/p' demo按内容匹配(正则),打印含“the”的行
输出以“PI”开头的行sed -n '/^PI/p' demo正则匹配行首,^表示行首
输出以数字结尾的行sed -n '/[0-9]$/p' demo正则匹配行尾,$表示行尾
输出含“wood”单词的行sed -n '/\<wood\>/p' demo\<\>表示单词边界,避免匹配“woood”等

4.2 文本删除:批量清理无用内容(d指令)

d指令用于删除匹配的行,注意:默认不修改原文件,仅输出删除后的结果;若需修改原文件,加-i选项。

案例命令说明
删除第3行sed '3d' demo输出删除第3行后的所有内容
删除3-5行sed '3,5d' demo删除连续行
删除含“cross”的行sed '/cross/d' demo删除匹配内容的行
删除以小写字母开头的行sed '/^[a-z]/d' demo正则匹配行首小写字母
删除以“.”结尾的行sed '/\.$/d' demo.是特殊字符,需转义\
删除空行sed '/^$/d' demo^$匹配空行

4.3 文本替换:批量修改内容(s/c/y指令)

替换是sed最常用的功能,核心是s指令(字符串替换),c(整行替换)和y(字符转换)为辅助。

4.3.1 s指令:字符串替换(最常用)

格式:s/被替换内容/替换内容/[选项],选项包括g(全局替换)、n(第n次匹配替换)。

  • 替换每行第一个“the”为“THE”:sed 's/the/THE/' demo
  • 替换每行第二个“l”为“L”:sed 's/l/L/2' demo
  • 全局替换所有“the”为“THE”:sed 's/the/THE/g' demo
  • 删除所有“o”(替换为空):sed 's/o//g' demo
  • 3-5行全局替换“the”为“THE”:sed '3,5s/the/THE/g' demo
  • 给含“the”的行首加#(注释):sed '/the/s/^/#/' demo
  • 给每行行尾加“EOF”:sed 's/$/EOF/' demo
4.3.2 c指令:整行替换
  • 将第3行替换为“Third line is replaced!”:sed '3c Third line is replaced!' demo
  • 将含“PI”的行替换为“圆周率:3.1415”:sed '/PI/c 圆周率:3.1415' demo
4.3.3 y指令:字符转换(按位置一一对应)
  • 将“abc”转换为“ABC”:echo "abc123" | sed 'y/abc/ABC/'(输出“ABC123”)

4.4 文本迁移:插入、追加与保存(a/i/w/r指令)

4.4.1 插入/追加(i/a指令)
  • 在第3行前插入“Insert before line 3”:sed '3i Insert before line 3' demo
  • 在第3行后插入“Insert after line 3”:sed '3a Insert after line 3' demo
  • 在含“the”的行后插入多行内容:sed '/the/a New1\nNew2' demo\n表示换行)
4.4.2 保存/读取(w/r指令)
  • 将含“the”的行保存到out.txtsed '/the/w out.txt' demo
  • /etc/hostname内容追加到含“the”的行后:sed '/the/r /etc/hostname' demo

4.5 多行处理:保留空间的应用(H/G指令)

sed的“保留空间”(Hold Space)是另一个临时缓冲区,用于暂存多行内容,配合H(复制到保留空间)和G(追加到模式空间)实现多行迁移。

  • 将含“the”的行迁移到文件末尾:sed '/the/{H;d};$G' demo{H;d}表示“复制到保留空间后删除当前行”,$G表示“在最后一行后追加保留空间内容”)
  • 将1-5行迁移到第7行后:sed '1,5{H;d};7G' demo

4.6 脚本批量处理:多指令集成(-f选项)

当需要执行多个指令时,可将指令写入脚本文件,通过-f调用,更易维护。

  1. 创建脚本文件opt.sed
    # 指令1:删除空行
    /^$/d
    # 指令2:全局替换“the”为“THE”
    s/the/THE/g
    # 指令3:给第3行前插入注释
    3i # This is line 3
    
  2. 执行脚本:sed -f opt.sed demo

五、生产环境实战:sed的高频应用场景

sed在生产环境中常用于配置文件修改、日志分析、批量处理等场景,以下为典型案例。

5.1 修改网络配置:设置IP地址

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

# 使用-i.bak备份原文件,避免失误无法恢复
sed -i.bak 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network-scripts/ifcfg-ens33
  • 解析:^IPADDR=.*匹配“IPADDR=”开头的行,.*表示任意字符,替换为指定IP。

5.2 调整Apache配置:修改监听地址与端口

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

# 修改监听地址和端口
sudo sed -i 's/^Listen .*/Listen 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf
# 修改ServerName
sudo sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf

5.3 配置vsftpd服务:禁止匿名登录

需求:编写脚本,禁止vsftpd匿名登录,允许本地用户登录并写入。

#!/bin/bash
# 脚本名:config_vsftpd.sh
# 1. 定义路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"# 2. 备份原配置(若未备份)
[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak# 3. 基于样本配置修改:禁止匿名登录,允许本地用户及写入
sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG
sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG# 4. 若没有listen配置,添加到文件末尾
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG# 5. 重启服务并设置开机自启
systemctl restart vsftpd
systemctl enable vsftpd

执行脚本:chmod +x config_vsftpd.sh && ./config_vsftpd.sh

5.4 提取网卡IP地址:结合管道与正则

需求:从ifconfig ens33的输出中提取IP地址。

ifconfig ens33 | sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'
  • 解析:
    • 2s:作用于第2行(ifconfig输出中IP通常在第2行);
    • .*inet ([0-9.]+) .*:正则匹配“inet ”后的IP地址([0-9.]+匹配IP,()分组提取);
    • \1:引用分组1的内容(即IP地址);
    • -r:使用扩展正则,无需转义()-n:取消默认输出,仅打印匹配结果。

六、sed使用注意事项

  1. 原文件保护:使用-i修改原文件前,务必先备份(如-i.bak),避免误操作导致数据丢失。
  2. 正则转义:默认情况下sed使用基础正则,()、{}、|等特殊字符需转义(如\();若使用-r/-E选项,可直接使用扩展正则,无需转义。
  3. 行地址范围n1,n2表示“从n1到n2行”,n1~n2表示“从n1行开始,每隔n2行”(如1~2表示奇数行)。
  4. 多指令分组:对同一行执行多个指令时,可使用{指令1;指令2;...}分组(如sed '/root/{s/root/ROOT/;s/x/X/g}' /etc/passwd)。

总结

sed作为Linux下的流编辑器,凭借“逐行处理+脚本驱动”的特性,在文本批量处理场景中效率远超交互式编辑器。本文从原理到实战,覆盖了sed的核心用法与生产场景,掌握这些内容后,你可以轻松应对日志分析、配置修改、数据清洗等常见任务。

sed的功能远不止于此,结合正则表达式和脚本编程,还能实现更复杂的文本处理逻辑。建议多动手练习,根据实际需求灵活组合指令,逐步提升文本处理效率!

http://www.dtcms.com/a/364070.html

相关文章:

  • IsaacLab训练机器人
  • 保障系统稳定运行!瑞芯微RK3506Watchdog看门狗配置与使用攻略
  • 【系统架构师设计(9)】需求工程全生命周期管理:从定义到变更的完整体系
  • 第2.7节:多模态大模型之Midjourney
  • 《面试必备:JVM垃圾回收机制深度解析(附高频问题应对)》
  • 【线段树】3525. 求出数组的 X 值 II|2645
  • solidity从入门到精通 第七章:高级特性与实战项目
  • 机器视觉的平板电脑OCA全贴合应用
  • 修改⽂件之git
  • 企业微信AI在银行落地的3个实用场景:智能机器人、搜索、文档的具体用法
  • 了解名词ARM Linux的SOC
  • 枚举和泛型
  • 高性能接口实现方案
  • 刷题日记0902
  • 38.Ansible判断+实例
  • 硬件:51单片机
  • 【Unity Shader学习笔记】(一)计算机图形学
  • shell脚本案例
  • 【Unity Shader学习笔记】(二)图形显示系统
  • nmap扫描端口,netstat
  • 二叉树经典题目详解(下)
  • CH01-1.1 Exercise-Ordinary Differential Equation-by LiuChao
  • 猫猫狐狐的“你今天有点怪怪的”侦察日记
  • 标贝科技参编《数据标注产业发展研究报告(2025 年)》
  • ARM裸机开发(GPIO标准库开发)
  • Java搭建高效后端,Vue打造友好前端,联合构建电子采购管理系统,实现采购流程电子化、自动化,涵盖采购全周期管理,功能完备,附详细可运行源码
  • 提高卷积神经网络模型的一些应用
  • 复刻 Python 实现的小智语音客户端项目py-xiaozhi日记
  • AI助力开发:JetBrains官方DeepSeek插件Continue一站式上手!
  • 为什么研发文档的变更缺乏审批和追溯