【Shell语言学堂】sed命令最全详解

news2024/11/28 4:47:00

三剑客之sed

  • linux sed命令详解
    • 1.简介
    • 2.定址
    • 3.sed选项
    • 4.正则表达式元字符
    • 5.具体应用
      • 1、行打印
      • 2、替换指定文本
      • 3、插入文本行,追加文本行
      • 4、sed命令的删除功能
      • 5、其他命令
      • 6、`sed` 的分组替换功能
      • 7、sed -r或者sed -E


linux sed命令详解

CSDN@划过手的泪滴t


1.简介

sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。
执行时,sed会从文件或者标准输入中读取一行,将其复制到缓冲区,对文本编辑完成之后,读取下一行直到所有的文本行都编辑完毕。
所以sed命令处理时只会改变缓冲区中文本的副本,如果想要直接编辑原文件,可以使用-i选项或者将结果重定向到新的文件中。

sed命令的基本语法如下:

sed [options] commands [inputfile...]

2.定址

定址用于决定对哪些行进行编辑。地址的形式可以是数字、正则表达式、或二者的结合。如果没有指定地址,sed将处理输入文件的所有行。

地址是一个数字,则表示行号;是“$"符号,则表示最后一行。例如:

sed -n '3p' datafile
#只打印第三行

地址是逗号分隔的,那么需要处理的地址是这两行之间的范围(包括这两行在内)。范围可以用数字、正则表达式、或二者的组合表示。例如:

sed '2,5d' datafile
#删除第二到第五行
sed '/My/,/You/d' datafile
#删除包含"My"的行到包含"You"的行之间的行
sed '/My/,10d' datafile
#删除包含"My"的行到第十行的内容

3.sed选项

选项 功能
-e 进行多项编辑,即对输入行应用多条sed命令时使用
-n 取消默认的输出
-f 指定sed脚本的文件名
-i 直接编辑原文件
-l 指定行的长度
-r 在脚本中使用扩展表达式

执行多条命令的格式:

sed -e '操作1' -e '操作2' 文件
sed -n -e '/^r/p' -e '/^b/p' /etc/passwd

sed -e '操作1;操作2' 文件

sed命令的操作符
在这里插入图片描述

4.正则表达式元字符

在这里插入图片描述

5.具体应用

sed命令比较适用于大的文本文件,用普通文本编辑器难以胜任的情况。下面分别介绍直接打印、插入、删除、替换等编辑操作。

1、行打印

输出缓冲区内容,使用sed的p 子命令
p子命令代表print,可以打印出sed缓冲区内的内容。
sed命令中,直接采用数字代表某个特定的文本行:'1 p’代表打印第一行;'1,3 p’代表打印1到3行;特别的,最后一行的行号为$。

不使用-n选项时,sed命令把1到3行输出了两次。这是因为不使用-n时,sed首先读取一行,并默认将缓冲区内的文本输出出来,之后p子命令再次输出。使用-n时,默认输出取消,只有p子命令的输出结果。

sed -n '1,3 p' test1.txt
sed -n '1~2 p' test1.txt
#1~2表示从第一行开始,行号递增2输出,即输出奇数行。语法格式为first~step。

打印奇数行或偶数行
方法1:

 sed -n 'p;n' test.txt  #奇数行 
 sed -n 'n;p' test.txt  #偶数行 

方法2:

 sed -n '1~2p' test.txt  #奇数行 
 sed -n '2~2p' test.txt  #偶数行 

指定打印第几行往下几行
格式:sed -n 'n,+np' 文件名

2、替换指定文本

使用s子命令
这一个命令实用性很广,并且灵活。语法也比之上面特别一些:

sed '位置参数 s/pattern/replaced/[flag]'

pattern为要替换的文本,支持正则表达式,replaced表示用来替换的一般字符串(不支持正则表达式)。

flag是替换标志,用来影响匹配替换的规则:

flag 用法

g 全局匹配,会替换文本行中所有匹配的字符串 十进制n 替换文本行中第n个匹配的字符串
p 替换第一个匹配的字符串,并且将缓冲区输出到标准输出 w 替换第一个匹配的字符串,并且将改动的行输出到磁盘文件中
缺省 替换第一个匹配的字符串

3、插入文本行,追加文本行

这两种情况很类似。插入文本使用i子命令,表示在指定位置前面插入文本;追加文本使用a子命令,表示在指定位置之后插入文本。

  • a:在下一行添加内容
sed '/添加的行/a 添加的内容' 文件名
  • i:在上一行插入内容
sed '/添加的行/i 添加的内容' 文件名

变形:y命令
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:

 sed '1,10y/abcde/ABCDE/' file

4、sed命令的删除功能

删除操作:d命令
删除空白行:

 sed '/^$/d' file

删除文件的第2行:

 sed '2d' file

删除文件的第2行到末尾所有行:

 sed '2,$d' file

删除文件最后一行:

 sed '$d' file

删除文件中所有开头是test的行:

 sed '/^test/'d file

5、其他命令

写入文件:w命令
在example中所有包含test的行都被写入file里:

 sed -n '/test/w file' example

从文件读入:r命令
file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面:

 sed '/test/r file' filename

删除空行的三种方法

(1)grep -v “^$” 文件名#过滤出非空行
(2)cat 文件名 | tr -s\n"#压缩换行符
(3)sed '/^$/d' 文件名#删除空行

6、sed 的分组替换功能

sed 的分组替换功能允许您在正则表达式中使用圆括号 () 来捕获一组字符作为一个整体,然后在替换字符串中通过反向引用(\n,其中 n 是捕获组的编号)来引用这些被捕获的字符。下面是如何使用 sed 进行分组替换的示例:

字符串位置替换

除了使用分组进行替换外,sed 还可以直接通过字符位置来进行替换。例如,您可以使用 s 命令的子串替换功能来替换从特定位置开始的固定长度的子串。以下是一个示例:

**示例 **:将每行的第 .png 结尾的单词替换为 .jpg:

echo "This is an image.png file." | sed 's/\(\w*\).png/\1.jpg/g'

这里,\(\w*\) 匹配并捕获一个或多个单词字符(字母、数字或下划线),直到遇到 “.png”。替换字符串 \1.jpg 使用反向引用 \1 引用捕获的单词字符,将 “.png” 替换为 “.jpg”。

示例 2:将每行的第五个到第七个字符替换为 “XYZ”:

echo "0123456789ABCDEF" | sed 's/^\(....\)\(...\)/\1XYZ/g'

这里,^\(....\)\(...\) 匹配行首的前四个字符(\(....\))作为第一捕获组,接着匹配并捕获接下来的三个字符(\(...\))作为第二捕获组。替换字符串 \1XYZ 保留第一捕获组的内容,并将第二捕获组的内容替换为 “XYZ”。

综上所述,sed 提供了分组和基于位置的替换功能,可以根据不同的需求灵活应用这些功能来修改文本内容。

1.分组替换字符
sed ‘$r 123.txt’ test.txt #先读取123.txt内容,然后再到test.txt的末行插入读取的所有内

echo bbxx | sed -r 's/(bb)(xx)/\2\1/'

在这里插入图片描述

echo 你喜欢我 | sed -r 's/(.)(.)(.)(.)/\4\2\3\1/'

7、sed -r或者sed -E

sed -r 是 sed 命令的一个选项,用于启用扩展(extended)正则表达式(ERE)。在某些 sed 实现中(如 GNU sed),使用 -r 或 -E 选项可以使 sed 解析器接受扩展正则表达式的语法,相比基本正则表达式(BRE),扩展正则表达式提供了更丰富、更直观的正则表达式语法。

在您提到的场景——将文件中的所有连续空格替换为单个空格——中,使用 -r 选项并非必需,因为该任务可以使用基本正则表达式轻松完成。不过,如果您已经习惯使用扩展正则表达式的语法,也可以在命令中加入 -r 选项:

sed -r 's/ +/ /g' file > output_file

这里的替换命令 s/ +/ /g 与之前的基本正则表达式版本 s/ + / /g 功能相同,都是查找并替换所有连续的空格为单个空格。主要区别在于:

在扩展正则表达式中,连续空格的表示方式更为简洁,不需要在重复量词(+)前加反斜杠进行转义。
使用 -r 选项后,其他扩展正则表达式的特性(如 | 表示逻辑或、() 用于分组等)也可以在 sed 命令中直接使用,而无需额外的反斜杠转义。
总之,sed -r 是一个开启扩展正则表达式支持的选项,使得 sed 命令能够理解并处理扩展正则表达式的语法。在实际使用时,根据个人习惯和具体需求选择是否启用该选项。对于替换连续空格的任务,无论是否使用 -r 选项,都可以得到相同的结果。


在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

L2-1 堆宝塔分数

本题链接:PTA | 程序设计类实验辅助教学平台 题目: 样例: 输入 11 10 8 9 5 12 11 4 3 1 9 15 输出 4 5 思路: 这是一道模拟题,需要有耐心读题,跟着题目走一遍,就可以了。 代码详解如下&…

润乾报表平台 InputServlet 任意文件读取漏洞复现

0x01 产品简介 润乾报表是一个纯JAVA的企业级报表工具,支持对J2EE系统的嵌入式部署,无缝集成。服务器端支持各种常见的操作系统,支持各种常见的关系数据库和各类J2 EE的应用服务器,客户端采用标准纯html方式展现,支持…

基于SSM的游戏攻略管理系统

游戏攻略管理系统的构建与实现 一、系统概述二、系统架构与技术选型三、系统功能模块四、系统特点五、总结与展望 随着网络游戏的普及和发展,游戏攻略成为玩家们提升游戏技能、了解游戏机制的重要途径。为了更好地满足玩家需求,提高游戏攻略的管理效率和…

Xinstall:实现注册后自动绑定,提升用户体验

在移动互联网时代,App的注册与绑定流程对于用户体验至关重要。繁琐的注册步骤和手动绑定操作往往会让用户望而却步,导致用户流失。为了解决这一问题,Xinstall品牌推出了注册后自动绑定功能,极大提升了用户体验。 Xinstall的自动…

优惠券布局的最终方案------css属性mask

先贴图&#xff1a; 以上这些都是通过mask去实现出来&#xff1a; <!DOCTYPE html><html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

实战小项目 | ESP32-S3和ESP32-C3通过ESP-Mesh-Lite组网 温湿度传感器案例

传统Wi-Fi网络所有终端设备都需要直接与路由器相连&#xff0c;这使得Wi-Fi的覆盖区域受到路由器位置的限制&#xff0c;可接入终端设备的数量也受到路由器容量的限制。而乐鑫ESP-Mesh-Lite Wi-Fi组网方案&#xff0c;所有终端设备都可以与相邻设备连接&#xff0c;摆脱了对路由…

升级多款教育行业解决方案 星辰天合推动高校高质量发展

4 月 12-14 日&#xff0c;由江苏省高校教育信息化研究会网络信息管理专业委员&#xff08;以下简称&#xff1a;江苏高校网委会&#xff09;主办&#xff0c;河海大学网络安全与信息化办公室、常州大学信息化建设与管理处联合承办的 2024 研讨会暨学术年会在江苏金坛召开。本次…

IDjpg Ai:开启艺术风格的无限可能

在这个充满创意的时代&#xff0c;每个人都可以成为艺术家。IDjpg Ai&#xff0c;一款由人工智能AI模型驱动的图片转换工具&#xff0c;让您的照片瞬间变身为3D、卡通、线稿、动漫、电影等无限种艺术风格。这不仅仅是一款软件&#xff0c;它是您通往创意宇宙的钥匙。 一键转换&…

竞技游戏新纪元:如何打造满足现代玩家需求的极致体验?

文章目录 一、现代玩家需求分析二、以玩家体验为核心的游戏设计三、个性化与定制化服务四、强化社交互动与社区建设五、持续更新与优化《游戏力&#xff1a;竞技游戏设计实战教程》亮点编辑推荐内容简介目录获取方式 随着科技的飞速发展和游戏产业的不断壮大&#xff0c;现代玩…

代码随想录算法训练营第四十一天| 343. 整数拆分,96.不同的二叉搜索树

题目与题解 343. 整数拆分 题目链接&#xff1a;343. 整数拆分 代码随想录题解&#xff1a;343. 整数拆分 视频讲解&#xff1a;动态规划&#xff0c;本题关键在于理解递推公式&#xff01;| LeetCode&#xff1a;343. 整数拆分_哔哩哔哩_bilibili 解题思路&#xff1a; 一眼懵…

Banana Pi开源社区推出BPI-5202开发板,国产龙芯Loongson 2K1000LA

BPI-5202开发板&#xff0c;国产龙芯Loongson 2K1000LA BPI-5202作为单纯的嵌入式通用控制器软硬件开发平台&#xff0c;采用龙芯2K1000LA芯片设计&#xff0c;基本配置中有2个独立MAC以太网端口、2个RS485端口1个RS232端口2个CAN2.0端口&#xff0c;配置灵活&#xff0c;广泛适…

SQL注入利用学习 - 延时盲注

延时盲注原理 无法利用页面显示结果判断SQL注入是否执行成功&#xff0c;此时可以利用 SQL语句执行的延时 判断SQL是 否执行成功。 只要可以执行延时&#xff0c;那么就可以利用该注入技术。 sql时间类型的盲注本质是利用插入的SQL语句执行造成时间延迟&#xff0c;插入的SQ…

树莓派安装tensorflow

使用编译好的版本 下载tensorflow编译好的版本 https://github.com/lhelontra/tensorflow-on-arm/tags由于python版本支持有限可能需要自己安装python 安装对应的python 自己选择版本进行编译

TQZC706开发板教程:使用vivado2023_1创建hello_world工程

打开Vivado2023.1-->创建工程-->输入工程名称-->选择保存地址-->下一步 勾选不添加文件-->下一步 搜索7z045ffg-->选择xc7z045ffg900-2-->下一步&#xff0c;finish完成工程创建 添加设计-->设置名称-->OK 添加IP-->搜索zynq-->双击确定选择 …

antDesignVue 使用-持续更新

背景 vue3viteantdesignvuevue-router 1,全局完整注册 1.1下载antdesignvue npm i --save ant-design-vue 或者 npm install ant-design-vuenext --save 1.2在mian.ts中引入 import { createApp } from vue import { createPinia } from piniaimport App from ./App.vue …

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示32行点x32列点字模的功能

基于STC12C5A60S2系列1T 8051单片机的带字库液晶显示器LCD12864数据传输并行模式显示32行点x32列点字模的应用 STC12C5A60S2系列1T 8051单片机管脚图STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式及配置STC12C5A60S2系列1T 8051单片机I/O口各种不同工作模式介绍液晶显示…

小红书搜索团队提出新解码策略,降低大模型推理成本

如何让大语言模型&#xff08;LLMs&#xff09;“智能涌现”&#xff1f;关键技术之一是思维链&#xff08;Chain of Thought&#xff0c;CoT&#xff09;&#xff0c;它通过引导大模型&#xff0c;一步一步模拟人类思考过程&#xff0c;可有效增强大模型的逻辑推理能力。 而自…

Python的pytest框架(1)--基本概念、入门

按基础到进阶的顺序&#xff0c;学习Python的pytest框架&#xff0c;本篇文章先讲一讲pytest的基本概念、入门使用规则。 目录 一、pytest基础知识 1、安装 2、pytest框架主要做了什么工作 二、pytest的规则约定、运行方式以及参数详解 1、编写测试用例 模块&#xff08…

react17 + antd4 如何实现Card组件与左侧内容对齐并撑满高度

在使用antd进行页面布局时&#xff0c;经常会遇到需要将内容区域进行左右分栏&#xff0c;并在右侧区域内放置一个或多个Card组件的情况。然而&#xff0c;有时我们会发现右侧的Card组件并不能与左侧的栏目对齐&#xff0c;尤其是当左侧栏目高度动态变化时。本文将介绍如何使用…

基于绿证-阶梯式碳交易交互的源荷互补调度优化

基于绿证-阶梯式碳交易交互的源荷互补调度优化 基于绿证-阶梯式碳交易交互的源荷互补调度优化代码获取戳此处代码获取戳此处 23年新鲜代码&#xff0c;基本完成四个场景的复现。 针对多能精合的区域综合能源系统的低经济运行问题&#xff0c;提出基于绿证-阶梯式碳交易交与的源…