文章目录

  • 前言
  • 一、什么是sed
  • 二、sed的原理
    • 2.1 sed工作流程的三个步骤
    • 2.2 sed的两个重要空间:
    • 2.3 sed的具体运作流程
  • 三、sed的常见用法
    • 3.1 sed的基本格式
    • 3.2 常用选项
    • 3.3 常用操作
      • 3.3.1 基本语法规则
      • 3.3.2 常用操作命令
    • 3.4 操作用法示例
      • 3.4.1 输出符合条件的文本(`p` 正常输出)
      • 3.4.2 结合正则表达式进行输出
      • 3.4.3 删除符合条件的文本`d`
      • 3.4.4 替换符合条件的文本`tr`
      • 3.4.5 迁移符合条件的文本
      • 3.4.6 使用脚本编辑文件
  • 四、生产环境的sed使用
    • 4.1 修改ip/监听地址
    • 4.2 编写vsftpd服务的自动配置
  • 总结


前言

想象一下,你正在整理一堆杂乱的文件,手忙脚乱地复制、粘贴、删除某些内容,甚至还要批量替换某些词。如果手动操作,不仅容易出错,还特别浪费时间。这时候,sed就像一位低调但高效的文本编辑助手,帮你自动完成这些繁琐的任务。

它不会像图形化工具那样花哨,但只要你告诉它规则,比如“把所有的‘苹果’换成‘橙子’”或者“删除空行”,它就能眨眼间搞定。它的风格简洁直接,擅长处理一行一行的文本,就像流水线上的工人,精准又高效。

不过,如果你觉得sed只能做简单的“查找替换”,那就太小看它了——它还能匹配模式、条件编辑,甚至结合正则表达式玩出更复杂的操作。而当你熟悉了sed之后,可能会发现,有时候你需要的不只是编辑文本,还要分析、计算、提取数据……这时候,另一位更强大的搭档awk就该登场了。

但别急,先让我们把sed的基本功练扎实,毕竟再厉害的编程技巧,也得从最顺手的小工具开始。


一、什么是sed

sed(Stream EDitor,流编辑器)是一个强大而轻量的流式文本编辑器。它诞生于 Unix 早期,由 Lee E. McMahon 于 1973 年到 1974 年间开发,是 Linux/Unix 系统中最基础和最重要的工具之一。

它的核心特点如下:

  • 非交互式:与 vimnano 这类交互式编辑器不同,sed 通过接收命令或脚本文件来批量处理文本,无需用户介入。这使得它非常适合在脚本和自动化任务中使用。
  • 面向数据流sed 逐行处理输入(可以是文件或标准输入),将结果输出到标准输出。它不会直接修改原始文件(除非明确指定),这保证了操作的安全性。
  • 功能强大:主要功能包括文本替换、删除、打印、插入、追加、模式匹配等,尤其擅长查找和替换
  • 基于正则表达式:其强大的模式匹配能力建立在正则表达式之上,可以非常灵活地定位文本。

简单来说,sed 就像一个预设了规则的过滤器和加工器,文本流经过它,会被自动地按照指令进行修改和整理。


二、sed的原理

2.1 sed工作流程的三个步骤

理解 sed 的原理是掌握它的关键。其工作流程可以概括为以下三个步骤:

  1. 读取(Read)

    • sed 从输入流(文件或管道)中一次读取一行内容。
    • 将这行内容存储在其内部的临时缓冲区中,这个缓冲区称为模式空间(Pattern Space)
  2. 执行(Execute)

    • 将用户提供的所有 sed 命令(或脚本中的命令)按顺序应用到模式空间中的内容上。
    • 这是核心步骤,所有的替换、删除、打印等操作都在这里发生。
  3. 输出(Print)

    • 执行完所有命令后,除非有特殊指令(如 d 删除命令),否则模式空间中当前的内容会被自动输出到标准输出(屏幕)。
    • 然后清空模式空间,接着读取下一行,重复上述过程,直到处理完所有输入行。

这种 “读取-执行-输出” 的流水线模式,使得 sed 在处理超大文件时效率极高,因为它永远不会将整个文件加载到内存中。

2.2 sed的两个重要空间:

  • 模式空间(Pattern Space):如上所述,这是当前处理行的“工作台”,大部分操作都在这里进行。
  • 保持空间(Hold Space):一个辅助的缓冲区,用作临时存储。模式空间的内容可以和保持空间进行交换(gh)、追加(G)等操作,用于实现更复杂的多行处理功能。

2.3 sed的具体运作流程

  1. 将一行的内容读入模式空间。
  2. 从指定的操作指令中取出第一条指令,判断是否匹配pattern。
  3. 如果不匹配,直接不执行匹配条件后的编辑命令,转而读取下一条指令;如果匹配则执行编辑命令,对模式空间内的内容进行编辑,然后读取下一条指令。
  4. 当所有指令执行完毕,默认会输出模式空间内的内容,然后清空模式空间,读取下一行的内容。
  5. 当完成对所有行的读取时,结束。

注意:默认情况下所有的 sed 命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出(-i)。


三、sed的常见用法

3.1 sed的基本格式

调用sed命令有两种基本格式:

# 一、直接输入操作
sed [选项] '操作' 参数
# 二、通过调用脚本进行操作
sed [选项] -f scriptfile 参数

其中,“参数”指操作的目标文件,多个文件时用逗号分隔;“scriptfile”为脚本文件,需用 -f 指定。

3.2 常用选项

以下是 sed 常用选项的表格整理:

短选项长选项功能描述
-e--expression=用指定命令或脚本处理输入文件,可多次使用以叠加修改
-f--file=用指定脚本文件中的命令处理输入文件
-h--help显示帮助信息并退出
-n--quiet/silent仅显示被脚本处理后的行(默认输出所有行)
-i.bak-直接修改原文件(.bak为备份扩展名,可省略则仅修改不备份)
-r/-E-使用扩展正则表达式(-r为GNU扩展,-E符合POSIX)
-s-将多个输入文件视为独立文件,而非连续流(默认合并处理)

  1. -i-i.bak 实际行为相同,差异在于是否保留备份文件(如 -i 直接覆盖,-i.bak 保留原文件备份)。
  2. 部分选项(如 -r/-E)在不同系统实现中可能存在别名差异。

3.3 常用操作

3.3.1 基本语法规则

[n1[,n2]] 格式用于指定行范围,其中 n1n2 均为行号。

  • 单行操作:n1 表示仅对第 n1 行生效。
  • 范围操作:n1,n2 表示对第 n1 行至第 n2 行生效。
  • 省略 n1:如 ,n2 表示从第1行至第 n2 行。
  • 省略 n2:如 n1, 表示从第 n1 行至文件末尾。

3.3.2 常用操作命令

  • a:追加内容
    在指定行下方追加新行。
    示例:5a 在第5行下方追加,输入内容后以 . 结束。

  • c:替换行
    将选定行替换为新内容。
    示例:5,10c 替换第5-10行,输入新内容后以 . 结束。

  • d:删除行
    删除选定行。
    示例:5,20d 删除第5-20行。

  • i:插入行
    在选定行上方插入新内容。
    示例:5i 在第5行上方插入,输入内容后以 . 结束。

  • p:打印内容
    显示选定行内容,常与 -n 参数联用显示行号。
    示例:5,20p 打印第5-20行。

  • s:替换文本
    对选定行执行文本替换,语法为 s/原内容/新内容/[g]

    • g 为全局替换标志(可选)。
      示例:5,10s/foo/bar/g 将第5-10行的 foo 替换为 bar
  • y:字符转换
    按字符一一映射转换,语法为 y/原字符集/新字符集/
    示例:5,20y/abc/ABC/ 将第5-20行的 a→Ab→Bc→C


3.4 操作用法示例

3.4.1 输出符合条件的文本(p 正常输出)

sed -n 'p' test.txt           # 输出所有内容,等同于 cat
sed -n '3p' test.txt          # 输出第3行
sed -n '3,5p' test.txt        # 输出3~5行

在这里插入图片描述在这里插入图片描述

sed -n 'p;n' test.txt         # 输出所有奇数行
sed -n 'n;p' test.txt         # 输出所有偶数行
sed -n '1,5{p;n}' test.txt    # 输出1~5行之间的奇数行
sed -n '10,${n;p}' test.txt   # 输出第10行至文件尾的偶数行

请添加图片描述
请添加图片描述

sed -n 'h;n;p;g;p' test.txt  #输出所有内容,但两行间的内容互换,h,复制到保存空间,g,从保存空间获取到模式空间

在这里插入图片描述

3.4.2 结合正则表达式进行输出

sed -n '/the/p' test.txt        # 输出包含 the 的行
sed -n '4,/the/p' test.txt      # 输出从第4行至第一个包含 the 的行
sed -n '/the/=' test.txt        # 输出包含 the 的行号
sed -n '/^PI/p' test.txt        # 输出以 PI 开头的行
sed -n '/[0-9]$/p' test.txt     # 输出以数字结尾的行
sed -n '/\<woood\>/p' test.txt   # 输出包含单词 wood 的行,'\< \>'是边界,被包含的内容会被精确匹配

在这里插入图片描述在这里插入图片描述

3.4.3 删除符合条件的文本d

nl test.txt | sed '3d'                  # 删除第3行

请添加图片描述

nl test.txt | sed '3,5d'                # 删除3~5行

在这里插入图片描述

nl test.txt | sed '/cross/d'            # 删除包含 cross 的行

请添加图片描述

sed '/^[a-z]/d' test.txt                # 删除以小写字母开头的行

在这里插入图片描述

sed '/\.$/d' test.txt                   # 删除以“.”结尾的行

请添加图片描述


sed '/^$/d' test.txt                    # 删除所有空行# 删除连续空行(只保留一个)可使用:cat -s test.txt

请添加图片描述

3.4.4 替换符合条件的文本tr

sed 's/the/THE/' test.txt               # 每行第一个 the 替换为 THE

在这里插入图片描述

sed 's/l/L/2' test.txt                  # 每行第二个 l 替换为 L

在这里插入图片描述

sed 's/the/THE/g' test.txt              # 所有 the 替换为 THE

在这里插入图片描述

sed 's/o//g' test.txt                   # 删除所有字母 o

在这里插入图片描述

sed 's/^/#/' test.txt                   # 每行行首插入 #

在这里插入图片描述

sed '/the/s/^/#/' test.txt              # 在包含 the 的行首插入 #

在这里插入图片描述

sed 's/$/EOF/' test.txt                 # 每行行尾插入 EOF

在这里插入图片描述

sed '3,5s/the/THE/g' test.txt           # 将第3~5行中所有 the 替换为 THE

在这里插入图片描述

sed '/the/s/o/O/g' test.txt             # 在包含 the 的行中所有 o 替换为 O

在这里插入图片描述

# 直接修改配置文件示例:
sed -i.bak 's/SELINUX=disabled/SELINUX=enable/' /etc/selinux/config

在这里插入图片描述

3.4.5 迁移符合条件的文本

  • H:复制到剪贴板;

  • g、G:将剪贴板中的数据覆盖/追加至指定行;

  • w:保存为文件;

  • r:读取指定文件;

  • a:追加指定内容。具体操作方法如下所示。

  • I,i 忽略大小写

sed '/the/{H;d};$G' test.txt             # 将包含 the 的行移至文件末尾

在这里插入图片描述

sed '1,5{H;d};17G' test.txt              # 将第1~5行内容转移至第17行后

在这里插入图片描述

sed '/the/w out.file' test.txt           # 将包含 the 的行另存为文件

在这里插入图片描述

sed '/the/r /etc/hostname' test.txt      # 在包含 the 的每行后添加文件内容

在这里插入图片描述

sed '3aNew' test.txt                     # 在第3行后插入新行,内容为 New

在这里插入图片描述

sed '/the/aNew' test.txt                 # 在包含 the 的每行后插入新行

在这里插入图片描述

sed '3aNew1\nNew2' test.txt              # 在第3行后插入多行内容

在这里插入图片描述

sed '/the/IaNew' test.txt # I,i 可用于忽略大小写

在这里插入图片描述

3.4.6 使用脚本编辑文件

sed '1,5{H;d};16G'

以上命令可以转换成脚本文件,将多个编辑指令存入脚本文件(每行一条),通过 -f 调用:

# 编辑脚本文件:
vi opt.list
内容如下:
1,5H
1,5d
16G# 使用脚本:
sed -f opt.list test.txt

|| 表示上一条命令执行失败后才执行下一条。

四、生产环境的sed使用

4.1 修改ip/监听地址

需求: 需要将ens33网络接口的IP地址修改为 192.168.10.100

sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network_scripts/ifcfg-ens33

需求: 需要将 Apache 的监听地址修改为 192.168.10.100,端口修改为 8080

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

4.2 编写vsftpd服务的自动配置

需求: 编写一个脚本,用来调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。

#!/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# 调整配置
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
grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG# 重启并设置开机自启
systemctl restart vsftpd
systemctl enable vsftpd

总结

别停下,你已手握文本处理的利刃!

sed 看似简单,却是自动化脚本的灵魂。每一次精准的替换、每一次高效的删除,都在为你节省宝贵的时间。
记住:高手不是一天练成的,而是在一次次“查找-替换”中磨出来的。

你已经掌握了原理,接下来就是大胆实践:

  • 去清理日志、去修改配置、去批量重命名……
  • 让 sed 成为你的得力助手,把重复劳动交给机器!

未来的你,会感谢现在努力学习的自己。继续征服命令行,下一站:awk! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/95582.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/95582.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/95582.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Zotero白嫖腾讯云翻译

Zotero白嫖腾讯云无限制字数翻译 文章目录Zotero白嫖腾讯云无限制字数翻译1、安装插件1、登录腾讯云2、找到访问管理进入3、创建一个子用户4、启用机器翻译功能5、复制秘钥6、设置到Zotero1、安装插件 zotero-pdf-translate&#xff1a;https://github.com/windingwind/zotero…

TCP多进程和多线程并发服务

进程和线程的区别&#xff1a; 详细的可以参考这样文档进程和线程的区别(超详细)-CSDN博客 核心比喻 进程 一个工厂&#xff1a;这个工厂拥有独立的资源&#xff08;厂房、原材料、资金、电力&#xff09;。每个工厂之间是相互隔离的&#xff0c;一个工厂着火…

计算机毕业设计springboot基于Java+Spring的疫苗接种管理系统的设计与实现 基于Spring Boot框架的疫苗接种信息管理系统开发与应用 Java与Spring技术驱动的疫苗接种管理

计算机毕业设计springboot基于JavaSpring的疫苗接种管理系统的设计与实现69geq9 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09; 本套源码可以在文本联xi,先看具体系统功能演示视频领取&#xff0c;可分享源码参考。随着信息技术的飞速发展&#xff0c;计算机技术在…

C/C++圣诞树①

写在前面 圣诞节将至&#xff0c;我总想用代码做点什么&#xff0c;来表达对这个温馨节日的敬意。于是&#xff0c;我决定用C语言在控制台中绘制一幅充满节日气氛的圣诞树画面。它不仅有闪烁的雪花、五彩的灯光&#xff0c;还有一颗颗精心雕琢的心形图案&#xff0c;仿佛把整个…

【小白入】显示器核心参数对比度简介

对比度是一个非常核心的显示器参数。下面我们来了解一下。一、核心定义&#xff1a;什么是对比度&#xff1f;显示器的对比度&#xff08;Contrast Ratio&#xff09;是指其最亮状态&#xff08;白色&#xff09;与最暗状态&#xff08;黑色&#xff09;之间的亮度比值。简单来…

【项目】多模态RAG必备神器—olmOCR重塑PDF文本提取格局

【项目】多模态RAG必备神器—olmOCR重塑PDF文本提取格局&#xff08;一&#xff09;olmOCR是什么&#xff1f;&#xff08;二&#xff09;olmOCR 的核心技术&#xff08;1&#xff09;文档锚定技术&#xff08;2&#xff09;微调 7B 视觉语言模型&#xff08;三&#xff09;olm…

解决Android Studio查找aar源码的错误

我又来给大模型贡献素材了&#xff01; 问题 在更新了Android Studio Narwhal Feature Drop | 2025.1.2 Patch 1版本之后&#xff0c;遇到了一个问题&#xff0c;很烦人&#xff01;AS每次更新都能搞出点新毛病&#xff0c;真的服了。使用离线依赖aar包引入某个库之后&#xff…

华为HCIP、HCIE认证:自学与培训班的抉择

大家好&#xff0c;这里是G-LAB IT实验室。 在追求个人职业发展的道路上&#xff0c;取得华为的HCIP或HCIE认证是许多IT从业者的重要目标之一。 但在备考过程中&#xff0c;我们常常面临一个选择&#xff1a;是自学还是报名参加培训班&#xff1f;本文将针对这个问题&#xff0…

空调噪音不穿帮,声网虚拟直播降噪技巧超实用

虚拟主播团队负责人来吐槽&#xff01;实时互动是核心&#xff0c;可主播回应慢半拍、动作表情跟不上语音&#xff0c;用户立马觉得假&#xff0c;哗哗流失。之前方案端到端延迟 700ms&#xff0c;互动总慢一步。直到接入商汤日日新大模型和声网合作方案&#xff0c;延迟压到 5…

Spark和Spring整合处理离线数据

如果你比较熟悉JavaWeb应用开发&#xff0c;那么对Spring框架一定不陌生&#xff0c;并且JavaWeb通常是基于SSM搭起的架构&#xff0c;主要用Java语言开发。但是开发Spark程序&#xff0c;Scala语言往往必不可少。 众所周知&#xff0c;Scala如同Java一样&#xff0c;都是运行…

智能高效内存分配器测试报告

一、项目背景 这个项目是为了学习和实现一个高性能、特别是高并发场景下的内存分配器。这个项目是基于谷歌开源项目tcmalloc(Thread-Caching Malloc)实现的。tcmalloc 的核心目标就是替代系统默认的 malloc/free&#xff0c;在多线程环境下提供更高效的内存管理。C/C的malloc虽…

吱吱企业通讯软件以安全为核心,构建高效沟通与协作一体化平台

随着即时通讯工具日益普及&#xff0c;企业面临一个严峻的挑战&#xff1a;如何在保障通讯数据安全的前提下&#xff0c;提升办公效率&#xff1f;为解决此问题&#xff0c;吱吱企业通讯软件诞生&#xff0c;通过私有化部署和深度集成的办公系统&#xff0c;为企业打造一个既可…

校企合作| 长春大学旅游学院副董事长张海涛率队到访卓翼智能,共绘无人机技术赋能“AI+文旅”发展新蓝图

为积极响应国务院《关于深入实施“人工智能”行动的意见》&#xff08;国发〔2025〕11号&#xff09;号召&#xff0c;扎实推进学校“旅游”与“人工智能”双轮驱动的学科发展战略&#xff0c;加快无人机技术在文旅领域的创新应用&#xff0c;近日长春大学旅游学院副董事长张海…

为什么要用 MarkItDown?以及如何使用它

在处理大量文档时&#xff0c;尤其是在构建知识库、进行文档分析或训练大语言模型&#xff08;LLM&#xff09;时&#xff0c;将各种格式的文件&#xff08;如 PDF、Word、Excel、PPT、HTML 等&#xff09;转换为统一的 Markdown 格式&#xff0c;能够显著提高处理效率和兼容性…

LVGL9.3 vscode 模拟环境搭建

1、git 克隆&#xff1a; git clone -b release/v9.3 https://github.com/lvgl/lv_port_pc_vscode.git 2、cmake 和 mingw 环境搭建 cmake&#xff1a; https://blog.csdn.net/qq_51355375/article/details/139186681?spm1011.2415.3001.5331 mingw&#xff1a; https://bl…

投影矩阵:计算机图形学中的三维到二维转换

投影矩阵是计算机图形学中的核心概念之一&#xff0c;它负责将三维场景中的几何数据投影到二维屏幕上&#xff0c;从而实现三维到二维的转换。无论是游戏开发、虚拟现实&#xff0c;还是3D建模&#xff0c;投影矩阵都扮演着不可或缺的角色。本文将深入探讨投影矩阵的基本原理、…

10.2 工程学中的矩阵(2)

十、例题 【例3】求由弹簧连接的 100100100 个质点的位移 u(1),u(2),...,u(100)u(1),u(2),...,u(100)u(1),u(2),...,u(100), 弹性系数均为 c1c 1c1, 每个质点受到的外力均为 f(i)0.01f(i)0.01f(i)0.01. 画出两端固定和固定-自由这两种情形 u 的图形。 解&#xff1a; % 参数设…

Mysql主从复制之延时同步

1.延时同步概念通过人为配置从库和主库延时N小时可以实现延时同步&#xff0c;延时同步可以解决数据库故障出现的数据丢失问题(物理损坏如直接使用rm删除数据库数据和逻辑损坏如使用drop命令删除数据库)2.延时同步实操2.1先配置从库延时同步&#xff0c;并且设置sql线程300秒后…

【QT特性技术讲解】QPrinter、QPdf

前言 QT对打印和PDF应用场景&#xff0c;做了简单的封装&#xff0c;复杂的功能还是得用第三方库&#xff0c;打印功能简单的文本可以不用PDF&#xff0c;涉及图形的基本都要用到PDF。 Linux打印 随着国产信创项目替换基于Linux的桌面系统国产信创系统&#xff0c;Linux桌面系…

【大数据技术实战】Flink+DS+Dinky 自动化构建数仓平台

一、背景&#xff1a;企业数仓建设的现状与挑战在数字化转型进入深水区的今天&#xff0c;数据已成为企业核心生产要素&#xff0c;而实时数仓作为 “数据驱动决策” 的关键载体&#xff0c;其建设水平直接决定企业在市场竞争中的响应速度与决策精度。根据 IDC《2024 年全球大数…