Linux 文本处理利器:sed 命令

sed 简介

sed(Stream Editor)是一款非交互式的流编辑器,诞生于 1973–1974 年间的贝尔实验室,由 McMahon 开发。它专为文本处理而生,功能强大,是 Linux 文本处理常客之一。

(另外两名常客通常视为 grep命令和 awk命令)

其中,sed 与 awk 并称 Linux/Unix 两大文字处理王牌工具,sed 侧重于替换,awk 侧重于分割与重组

本文将深入探讨 sed 命令的使用方法与实用技巧。


sed 工作流程

sed 的工作流程可简单概括为:

读取行 → 执行 → 显示 → 读取行 → 执行 → 显示 → ……(重复流程)

在这里插入图片描述

详细步骤:

  1. 读取行:从输入流(文件、管道、标准输入)读取一行存入 pattern space
  2. 执行:按顺序对当前行应用 sed 命令。
  3. 显示:将处理后的数据发送到输出流,并清空 pattern space
  4. 循环:重复上述过程直到所有输入处理完毕。

注意事项:

  • pattern space 是内存中的临时区域,关机或关闭终端后数据丢失。
  • 默认不修改源文件,除非使用 -i 选项。
  • hold space 是另一个内存区域,用于持久化存储数据,供后续检索使用。
  • 未指定输入文件时,sed 从标准输入读取数据。

环境准备

[furongwang@shell ~]$ vim test
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
daemon:x:2:2:daemon:/sbin:/bin/false
mail:x:8:12:mail:/var/spool/mail:/bin/false
ftp:x:14:11:ftp:/home/ftp:/bin/false
&nobody:$:99:99:nobody:/:/bin/false
zhangy:x:1000:100:,,,:/home/zhangy:/bin/bash
http:x:33:33::/srv/http:/bin/false
dbus:x:81:81:System message bus:/:/bin/false
hal:x:82:82:HAL daemon:/:/bin/false
mysql:x:89:89::/var/lib/mysql:/bin/false
aaa:x:1001:1001::/home/aaa:/bin/bash
ba:x:1002:1002::/home/zhangy:/bin/bash
test:x:1003:1003::/home/test:/bin/bash
@zhangying:*:1004:1004::/home/test:/bin/bash
policykit:x:102:1005:Po

sed 命令语法

基本格式:

sed [option] [sed-command] [input-file]

常用选项:

选项说明
-n禁止自动打印模式空间
-e添加要执行的脚本
-f从文件中读取脚本,脚本中的每一个 sed 命令独自成一行
-i直接修改源文件(可指定备份后缀)
-r使用扩展正则表达式

示例:

打印文件内容(模拟 cat):
sed '' data.txt(任意文件名)
[furongwang@shell ~]$ cat data.txt 
I am studing sed
I am www.twle.cn
I am a no-work-men
I am so handsome[furongwang@shell ~]$ sed '' data.txt 
I am studing sed
I am www.twle.cn
I am a no-work-men
I am so handsome
从标准输入读取:
sed ''# 输入内容后按 Ctrl+D 结束
[furongwang@shell ~]$ sed ''
# 输入hello world,并回车
hello world
# 输出hello world
hello world
# 按ctrl+d推出

行寻址与模式寻址

行寻址语法:

[address1[,address2]]命令

示例:

# 打印第1行
[furongwang@shell ~]$ sed -n '1p' test# 打印第1到3行
[furongwang@shell ~]$ sed -n '1,3p' test# 打印第3行到最后
[furongwang@shell ~]$ sed -n '3,$p' test# 打印第2行及后面2行
[furongwang@shell ~]$ sed -n '2,+2p' test# 每隔2行打印一次
[furongwang@shell ~]$ sed -n '1~2p' test

模式寻址:

# 打印含 "zhang" 的行
[furongwang@shell ~]$ sed -n '/zhang/p' test# 打印从 root 开头到 mail 开头的行
[furongwang@shell ~]$ sed -n '/^root/,/^mail/p' test

常用子命令详解

1. 打印(p / P)

  • p:打印整个模式空间
  • P:打印模式空间的第一行
[furongwang@shell ~]$ sed -n '1p' test          # 打印第1行
[furongwang@shell ~]$ sed -n '1,3p' test        # 打印1~3行

2. 读取下一行(n / N)

  • n:读取下一行覆盖当前行
  • N:追加下一行到当前行(用 \n 连接)
# 打印偶数行
[furongwang@shell ~]$ sed -n 'n;p' test# 合并相邻两行
[furongwang@shell ~]$ sed 'N;s/\n/==/' test

3. 替换(s)

# 替换每行第一个 root
[furongwang@shell ~]$ sed 's/root/tankzhang/' test# 替换所有 root
[furongwang@shell ~]$ sed 's/root/tankzhang/g' test# 替换每行第3个 my
[furongwang@shell ~]$ sed 's/my/your/3' test1.txt# 自定义分隔符
[furongwang@shell ~]$ sed 's#root#hello#' test

4. 插入与追加(i / a)

# 在匹配行上方插入
[furongwang@shell ~]$ sed '/root/i====aaaa====' test# 在匹配行下方追加
[furongwang@shell ~]$ sed '/root/a====iiii====' test

5. 删除(d / D)

  • d:删除整个模式空间
  • D:删除模式空间的第一行
# 删除1~14行
[furongwang@shell ~]$ sed '1,14d' test# 删除含 false 或 bash 的行
[furongwang@shell ~]$ sed '/\(false\|bash\)/d' test

6. 写文件(w / W)

# 将 root 开头的行写入文件
[furongwang@shell ~]$ sed -n '/^root/w output.txt' test
[furongwang@shell ~]$ cat output.txt
root:x:0:0:root:/root:/bin/bash# 小写w写入
[furongwang@shell ~]$ vim scripts 
1{
N
w write.log
}
[furongwang@shell ~]$ sed -n -f scripts test# 小写w写入包含模式中所有行
[furongwang@shell ~]$ cat write.log
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false# 大写W写入只包含模式中第一行
[furongwang@shell ~]$ vim scripts 
1{
N
W write.log
}
[furongwang@shell ~]$ sed -n -f scripts test
[furongwang@shell ~]$ cat write.log
root:x:0:0:root:/root:/bin/bash

7. 退出(q)

# 处理到第3行退出
[furongwang@shell ~]$ sed '3q' test

8. 取反(!)

# 打印非 root 开头的行
[furongwang@shell ~]$ sed -n '/^root/!p' test

高级用法

多命令执行:

# 使用分号分隔
[furongwang@shell ~]$ sed '1d;2d;5d' test# 使用 -e 选项
[furongwang@shell ~]$ sed -e '1d' -e '2d' test# 使用脚本文件
[furongwang@shell ~]$ sed -f script.sed test

正则表达式与子串:

# 使用转义括号
[furongwang@shell ~]$ sed 's/\(root\)/\1user/g' test# 使用 -r 避免转义
[furongwang@shell ~]$ sed -r 's/(root)/\1user/g' test# 使用 & 代表匹配内容
[furongwang@shell ~]$ sed 's/root/&user/g' test

模式空间与保持空间(g/G/h/H):

命令说明
g用保持空间内容覆盖模式空间
G将保持空间内容追加到模式空间
h用模式空间内容覆盖保持空间
H将模式空间内容追加到保持空间
# 每行后加空行
[furongwang@shell ~]$ sed 'G' test# 复制匹配行到文件末尾
[furongwang@shell ~]$ sed -e '/root/h' -e '$G' test

附:sed 命令完整帮助信息

[furongwang@shell ~]$ sed --help
Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]...-n, --quiet, --silentsuppress automatic printing of pattern space-e script, --expression=scriptadd the script to the commands to be executed-f script-file, --file=script-fileadd the contents of script-file to the commands to be executed--follow-symlinksfollow symlinks when processing in place-i[SUFFIX], --in-place[=SUFFIX]edit files in place (makes backup if SUFFIX supplied)-c, --copyuse copy instead of rename when shuffling files in -i mode-b, --binarydoes nothing; for compatibility with WIN32/CYGWIN/MSDOS/EMX (open files in binary mode (CR+LFs are not treated specially))-l N, --line-length=Nspecify the desired line-wrap length for the `l' command--posixdisable all GNU extensions.-r, --regexp-extendeduse extended regular expressions in the script.-s, --separateconsider files as separate rather than as a single continuouslong stream.-u, --unspaceedload minimal amounts of data from the input files and flushthe output spaces more often-z, --null-dataseparate lines by NUL characters--helpdisplay this help and exit--versionoutput version information and exitIf no -e, --expression, -f, or --file option is given, then the first
non-option argument is taken as the sed script to interpret.  All
remaining arguments are names of input files; if no input files are
specified, then the standard input is read.GNU sed home page: <http://www.gnu.org/software/sed/>.
General help using GNU software: <http://www.gnu.org/gethelp/>.
E-mail bug reports to: <bug-sed@gnu.org>.
Be sure to include the word ``sed'' somewhere in the ``Subject:'' field.
 -n, --quiet, --silent    取消自动打印模式空间-e 脚本, --expression=脚本   添加“脚本”到程序的运行列表-f 脚本文件, --file=脚本文件  添加“脚本文件”到程序的运行列表--follow-symlinks    直接修改文件时跟随软链接-i[扩展名], --in-place[=扩展名]    直接修改文件(如果指定扩展名就备份文件)-l N, --line-length=N   指定“l”命令的换行期望长度--posix  关闭所有 GNU 扩展-r, --regexp-extended  在脚本中使用扩展正则表达式-s, --separate  将输入文件视为各个独立的文件而不是一个长的连续输入-u, --unspaceed  从输入文件读取最少的数据,更频繁的刷新输出--help     打印帮助并退出--version  输出版本信息并退出-a ∶新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)-c ∶取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!-d ∶删除,因为是删除啊,所以 d 后面通常不接任何咚咚;-i ∶插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)-p ∶列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~-s ∶取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法

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

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

相关文章

week2-[一维数组]出现次数

week2-[一维数组]出现次数 题目描述 给定 NNN 个整数A1,A2,…,ANA_1,A_2,\ldots,A_NA1​,A2​,…,AN​。请求出这 NNN 个数中出现次数最多的数的出现次数&#xff0c;以及出现次数最少的数的出现次数。 输入格式 读入包括 222 行。第一行只有 111 个整数 NNN&#xff0c;表示数…

力扣 hot100 Day79

215. 数组中的第K个最大元素 给定整数数组 nums 和整数 k&#xff0c;请返回数组中第 k 个最大的元素。 请注意&#xff0c;你需要找的是数组排序后的第 k 个最大的元素&#xff0c;而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 class…

C++围绕音视频相关的资料都有哪些?如何进行学习

音视频技术涉及的内容广泛而深入。我会根据自己的知识给你提供一个系统性的音视频相关资料梳理&#xff0c;主要分为学习路径与核心知识、开源项目与实战、开发者资源以及热点与趋势几个方面&#xff0c;希望能帮助你高效地学习和探索。 先用一个表格来概览主要的学习方向和资…

AI自动化测试,解决传统自动化测试中​​脚本维护成本高、用例覆盖不全、缺陷发现滞后​​等痛点

AI自动化测试&#xff0c;解决传统自动化测试中​​脚本维护成本高、用例覆盖不全、缺陷发现滞后​​等痛点AI自动化测试通过机器学习&#xff08;ML&#xff09;、自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;等技术&#xff0c;解决了传统…

Laravel 事件与监听器

下面是一个完整的用户注册事件和监听器的实现示例&#xff0c;包含事件、监听器、注册、触发等完整流程。一、软件版本 php: 8.2.20laravel: 11mysql: 8.0.29 二、完整实现过程 1.创建事件 1.1 首先创建用户注册事件 php artisan make:event UserRegistered1.2 编辑app/Events/…

前端 React 实现数据懒加载-滚动触底加载数据

在 React 中使用 Intersection Observer API 实现触底加载分页&#xff08;无限滚动&#xff09;1.基本实现思路 在列表底部放置一个 哨兵元素&#xff08;Sentinel&#xff09;&#xff08;如 <div>&#xff09;。使用 IntersectionObserver 监听该元素是否进入视口&…

MySQL 50 道经典练习题及答案

目录 一、数据表设计与初始化 1. 数据表结构说明 2. 建表语句 3. 插入测试数据 二、练习题及答案 1. 查询 "01" 课程比 "02" 课程成绩高的学生的信息及课程分数 2. 查询同时存在 "01" 课程和 "02" 课程的情况 3. 查询存在 &qu…

电竞护航小程序搭建三角洲俱乐部护航派单小程序开发游戏派单系统定制开发

成品系统&#xff0c;可以快速搭建。功能概述&#xff1a;商家入驻、老板点单、快捷发单、自定义发单、发单列表、管事入驻、订单审核裁决、打手入驻、打手排行榜、邀请排行榜、账户充值、余额提现、成为客服等

MYSQL-增删查改CRUD

目录 &#x1f33f;前言&#xff1a; &#x1f33f;增-C-Create-新增 &#x1f9ca;单行数据全列插入 &#x1f34b;‍&#x1f7e9;语法&#xff1a; &#x1f34b;‍&#x1f7e9;演示&#xff1a; &#x1f9ca;指定列插入 &#x1f34b;‍&#x1f7e9;语法&#xf…

【Loss学习笔记】Focal loss、QFL、DFL、VFL——目标检测定位损失函数详解

文章目录Focal loss&#xff08;2018 ICCV &#xff0c;RetinaNet&#xff09;1、Focal Loss 提出背景问题一&#xff1a;正负样本数量不均衡问题问题二&#xff1a;难分类/易分类样本数量不均衡问题对两个问题的解决2、正负样本数量不均衡问题的解决&#xff1a;Focal loss 的…

nertctl使用了解

测试了几个容器&#xff0c;似乎未对k8s的containerd产生影响&#xff0c;都能访问 再次测试&#xff0c;containerd发生了重启&#xff0c;nrtdctl启动的容器都没了 #### sealos 创建containerd集群 sealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes:v1.29…

三、k8s 1.29 之 资源清单

一、什么是资源 资源(Resources) 是指集群中可被分配、管理和调度的各种实体,既包括计算、存储、网络等基础设施资源,也包括 K8s 自身定义的 API 对象(如 Pod、Deployment 等)。这些资源是 K8s 调度和管理工作负载的核心基础。 Kubernetes 中的资源本质上是 “可被操作的…

React中常用的Hook(useEffect、useRef、useMemo、useNavigate、useParams)

React hook1&#xff1a;useEffect 在编程中&#xff0c;副作用是指函数或表达式在执行过程中对外部环境产生影响的行为。例如&#xff1a; 修改外部变量&#xff08;如全局变量、DOM、API 请求、设置定时器等&#xff09; 什么是纯函数&#xff1f; // 纯函数&#xff1a;输入…

关联规则挖掘1:Apriori算法

目录 一、Apriori算法核心原理 1. 基本概念 2. Apriori性质 二、完整案例计算&#xff08;超市购物数据&#xff09; ​步骤1&#xff1a;按字母序重排每笔交易​ ​步骤2&#xff1a;统计频繁1-项集&#xff08;min_support40%&#xff09;​​ ​步骤3&#xff1a;生成…

基于 C++ 线程池的多线程目标检测后处理系统设计与实现

在实际的智能视频分析系统中,目标检测(如 YOLOv5)只是第一步。检测结果往往需要进行后续处理:画框、报警、推流、日志记录等。这些操作如果在检测主线程中同步执行,会严重拖慢整体推理速度。 本文将带你从零实现一个基于 C++ 模板线程池的异步后处理系统,实现“检测与后…

Java并发容器详解

1. JUC并发容器概述 Java集合容器框架主要有四大类别&#xff1a;List、Set、Queue、Map。常见的ArrayList、LinkedList、HashMap等容器都是非线程安全的。 Java提供了同步容器&#xff08;如Vector、Hashtable、SynchronizedList&#xff09;通过synchronized实现同步&#xf…

SpringAI系列---【SpringA集成OllamaI如何先调用向量库,再把查到的结果一起传给大模型?】

SpringAI如何先调用向量库&#xff0c;再把查到的结果一起传给大模型&#xff1f; 1.引入pom <dependencies><dependency><groupId>org.springframework.ai</groupId><artifactId>spring-ai-starter-model-ollama</artifactId></depend…

告别“测试滞后”:AI实时测试工具在敏捷开发中的落地经验

告别“测试滞后”&#xff1a;AI实时测试工具在敏捷开发中的落地经验 在敏捷开发的“快速迭代”节奏中&#xff0c;测试环节常常成为“拖后腿”的短板。某互联网公司的敏捷团队曾陷入这样的循环&#xff1a;2周迭代周期中&#xff0c;开发用10天完成功能&#xff0c;留给测试的…

K8S-Pod资源对象

一、K8S架构与组件1、K8S架构k8s 总体架构采用了经典的 maste/slave 架构模式&#xff0c;分 master 节点和 worker 节点&#xff0c;节点可以是虚拟机也可以是物理机。K8S组件 master 节点组件Kube-apiserver 用于暴露 Kubernetes API&#xff0c;任何资源请求或调用操作都是通…

PyTorch API 5

文章目录torch.compiler延伸阅读torch.fft快速傅里叶变换辅助函数torch.func什么是可组合的函数变换&#xff1f;为什么需要可组合的函数变换&#xff1f;延伸阅读torch.futurestorch.fx概述编写转换函数图结构快速入门图操作直接操作计算图使用 replace_pattern() 进行子图重写…