sed替换命令

用sed编辑流时,最强大的命令莫过于它的替换命令。它有许多参数选项,可以完成诸多复杂的工作。

1. 替换命令的语法

sed '[address-range|pattern-range] s/original-string
/replacement-string/[substitute-flags]' inputfile 

注意,上面的换行仅是为了阅读方便。下面我们逐项解释各个字段的含义:

  • address-range 或pattern-range:可选参数,用于指定sed命令的作用范围,如果没指定,那么sed将作用于输入的所有行。
  • s:替换命令
  • original-string:在输入文本中查找的源字符串。它可以是正则表达式
  • replacement-string:original-string将被替换为replacement-string
  • substitute-flags:可选的控制参数选项

sed命令并不会改变源文件的内容,它的替换指令同样不会。它仅作用于模式空间中的内容,并把处理后的结果输出到stdout。下面我们看两个实例:

1.1 把所有‘Fu Jian’替换为‘Guang Dong’

sed 's/Fu Jian/Guang Dong/' data.txt



1.2 只把包含Zhao的行里的‘Zhe Jiang’替换为‘Fu Jian'

sed '/Zhao/s/Zhe Jiang/Fu Jian/' data.txt



2. 全局标识g

 缺省sed命令只会替换每一行中查找到的第一个{original-string} 。如果你需要替换输入内容中的所有{original-string} ,那么你就需要全局标识g,它指示sed进行全局替换(当前行范围内)。

2.1 把第一个字母a替换为A

sed 's/a/A/' data.txt


2.2 替换所有字母a为A

sed 's/a/A/g' data.txt


3. 数值标识

可以用数值标识来指定第几次匹配到的字符串将被替换。数值的取值范围为1到512。比如说,/8标识将只替换第8次出现的字符串。

3.1 替换第2个a为A

sed 's/a/A/2' data.txt

 4. 打印标识p

替换命令里的打印标识p就是控制打印行为的。在替换成功后,它打印出修改后的内容。和其它sed命令一样,与-n选项结合使用,改变sed的缺省行为。

4.1 把所有‘Fu Jian’替换为‘Guang Dong’,并只输出修改过的行

sed -n 's/Fu Jian/Guang Dong/p' data.txt

 5. 写文件标识w

替换指令里的w标识作用于写文件。在替换成功后,它将修改后的内容写入一个文件。写脚本时,很多时候会用p来代替w,并通过重定向来写文件。

sed -n 's/Fu Jian/Guang Dong/w output.txt' data.txt
sed -n 's/Fu Jian/Guang Dong/p' data.txt > output.txt

 6. 忽略大小写标识i

sed匹配是大小写敏感的。可以使用i标识转换为大小写不敏感的模式,但这仅是GNU sed提供的特性,并非通用版本参数。

7. 执行标识e

这也是GNU sed提供的特性。通过e标识,你可以在模式空间上执行任何可用的shell命令,它的执行结果会返回给模式空间。

这里假设存在一个文件files.txt,其内容:

/etc/passwd 
/etc/group

执行:

sed 's/^/ls -l /' files.txt

它在文件的每一行的行首加上ls -l: 

 但是这样并不会真正执行shell命令。接下来,我们就用e标识让它执行起来:

sed 's/^/ls -l /e' files.txt

 8. 组合sed替换标识

前面的示例中,都是使用单一的标识。但是,你可以根据需求,组合多个标识使用。比如:

sed -n 's/Li/Lee/gipw output.txt' data.txt


9. sed替换的分隔符

前面的示例中,一直使用缺省的sed分隔符斜杠‘/’。如果original-string或replacement-string里包含斜杠,那么,就需要对它进行转义。如果文本里描述的是路径,可能转义后会变成这样:

 sed 's/\/usr\/local\/bin/\/usr\/bin/' path.txt

是不是很丑陋,书写又很麻烦?幸运的是,我们可以改变缺省的分隔符,很简单:

sed 's|/usr/local/bin|/usr/bin|' path.txt
sed 's^/usr/local/bin^/usr/bin^' path.txt
sed 's@/usr/local/bin@/usr/bin@' path.txt
sed 's!/usr/local/bin!/usr/bin!' path.txt

10. 作用同一行的多条替换命令

sed执行的流程是REPR,即,读取,执行,打印,重复。在执行阶段,可以有一条或多条sed命令,它们会依次执行。后面一条指令的输入,是前一条指令的输出,换句话说,如果前一条指令改变了模式空间里的某些内容,那么后一条指令处理的内容就不是原始输入的内容,而是前一条指令修改后的内容。

11. &-模式匹配

当replacement-string里使用&时,它既可以匹配常规的字符串,也可以执行模式匹配。给两个实例:

  • 为ID加上方括号:
sed 's/^[0-9][0-9][0-9]/[&]/g' data.txt

  •  为整行加上尖括号:
sed 's/^.*/<&>/' data.txt

 12. 分组替换(单个分组) 

sed可以使用分组,就像通常的正则表达式那样。分组以“\(”打头,并以“\)”结尾。分组可以和 back-referencing组合使用。Back-references是由分组选择的一个正则表达式的复用部分。sed里的Back-references可以出现在正则表达式里,也可以出现在替换命令中的replacement部分。

sed 's/\([^,]*\).*/\1/g' data.txt

命令说明:

  • 正则表达式\([^,]*\)匹配字符合串到第一个逗号为止
  • replacement-string里的\1替换第一个匹配的分组
  • g是全局替换标识

总结起来就一句话,提取输出内容中的第一个字段。

试试下面这个:

sed 's/\([^:]*\).*/\1/' /etc/passwd

下面这个示例,为每个单词打头的字母加上一对括号()。 

echo "The Geek Stuff" | sed 's/\(\b[A-Z]\)/\(\1\)/g'

13. 分组替换(多个分组)

sed支持多个分组替换,每个分组都由一个“\(”和一个“\)”来限定。当你在替换匹配的正则表达式中添加多个分组之后,可以在replacement串中通过 \n来指定第n个分组。

13.1 提取第一列和第三列字段

sed 's/\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/g' data.txt

14. GNU版本的扩展标识

GNU版本的sed有些有趣的扩展标识,它们可用于替换命令中的 replacement-string部分。

  • \l
  • \L
  • \u
  • \U
  • \E

它们的具体用途,请参考手册。

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

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

相关文章

【2023年11月第四版教材】《第6章-项目管理概论》(第二部分)

《第6章-项目管理概论》&#xff08;第二部分&#xff09; 3 项目经理的角色3.1 项目经理的影响力范围3.2 项目经理领导力风格 4 价值驱动的项目管理知识体系4.1 开发生命周期类型 5 五大过程组6 五个过程组和十大知识领域 3 项目经理的角色 3.1 项目经理的影响力范围 范围影…

Ganache 本地测试网远程连接

文章目录 前言1. 安装Ganache2. 安装cpolar3. 创建公网地址4. 公网访问连接5. 固定公网地址 前言 Ganache 是DApp的测试网络&#xff0c;提供图形化界面&#xff0c;log日志等&#xff1b;智能合约部署时需要连接测试网络。 Ganache 是一个运行在本地测试的网络,通过结合cpol…

窗口函数大揭秘!轻松计算数据累计占比,玩转数据分析的绝佳利器

上一篇文章《如何用窗口函数实现排名计算》中小编为大家介绍了窗口函数在排名计算场景中的应用&#xff0c;但实际上窗口函数除了可以进行单行计算&#xff0c;还可以在每行上打开一个指定大小的计算窗口&#xff0c;这个计算窗口可以由SQL中的语句具体指定&#xff0c;大到整个…

AI极客日报0822 - AI创作是否应该有版权?

&#x1f440;AI 日报合集 | &#x1f9e1; 点赞关注评论拜托啦&#xff01; 人工智能系统依法享有版权吗&#xff1f;这位法官给出了肯定的答案。让我们开始吧。 今日看点&#xff1a; 一位联邦法官明确表示&#xff0c;AI创作的艺术品没有版权&#xff01;中国&#xff0c…

PySide6学习笔记--基础环境的安装配置

PySide6介绍 QT官方发布Qt6.0之后&#xff0c;紧接着于2020年12月10日发布了PySide 6&#xff0c;对应C版的Qt6。从PySide6开始&#xff0c;PySide的命名也会与Qt的大版本号保持一致。需要注意的是使用PySide6开发的程序在默认情况下&#xff0c;不兼容Windows7系统&#xff0c…

测试框架pytest教程(4)运行测试

运行测试文件 $ pytest -q test_example.py 会运行该文件内test_开头的测试方法 该-q/--quiet标志使输出保持简短 测试类 pytest的测试用例可以不写在类中&#xff0c;但如果写在类中&#xff0c;类名需要是Test开头&#xff0c;非Test开头的类下的test_方法不会被搜集为用…

初识微服务

我们在曾经最常见的就是所谓的单体架构&#xff0c;但是由于网民越来越多&#xff0c;单体架构已经逐渐的被淘汰出去&#xff0c;所以我们在单体架构的基础上提出了微服务&#xff0c;它提倡将单一应用程序划分成一组小的服务&#xff0c;服务之间互相协调、互相配合&#xff0…

vue 使用nvm控制node 版本,随意切换 node 版本

1.nvm 下载安装 https://github.com/coreybutler/nvm-windows/releases 找自己版本 1.安装版本 nvm list available // 查看所有node 版本 nvm install 版本号 // 安装指定版本号2.nvm 列表展示 nvm list //展示所有版本号3.nvm 切换环境 nvm use 版本号 // 切换版本4.…

登录 jwt ,filter

cookie 在请求头中叫做cookie&#xff0c;在响应头中叫set-cookie GetMapping("/c1")public Result cookie1(HttpServletResponse resp){resp.addCookie(new Cookie("login_name","itheima"));return Result.success();}GetMapping("/c2&qu…

Postman的高级用法—Runner的使用​

1.首先在postman新建要批量运行的接口文件夹&#xff0c;新建一个接口&#xff0c;并设置好全局变量。 2.然后在Test里面设置好要断言的方法 如&#xff1a; tests["Status code is 200"] responseCode.code 200; tests["Response time is less than 10000…

三维模型OSGB格式轻量化的纹理压缩和质量保持分析

三维模型OSGB格式轻量化的纹理压缩和质量保持分析 在三维模型应用中&#xff0c;纹理数据是一个重要的部分&#xff0c;可以为模型增加更多的真实感和细节。但是&#xff0c;由于纹理数据通常会占用大量的存储空间和传输带宽&#xff0c;因此&#xff0c;在OSGB格式轻量化处理中…

几个Web自动化测试框架的比较:Cypress、Selenium和Playwright

介绍&#xff1a;Web自动化测试框架对于确保Web应用程序的质量和可靠性至关重要。它们帮助开发人员和测试人员自动执行重复性任务&#xff0c;跨多个浏览器和平台执行测试&#xff0c;并在开发早期发现问题。 以下仅代表作者观点&#xff1a; 本文探讨来3种流行的Web自动化测…

触摸屏与PLC之间 EtherNet/IP无线以太网通信

在实际系统中&#xff0c;同一个车间里分布多台PLC&#xff0c;用触摸屏集中控制。通常所有设备距离在几十米到上百米不等。在有通讯需求的时候&#xff0c;如果布线的话&#xff0c;工程量较大耽误工期&#xff0c;这种情况下比较适合采用无线通信方式。 本方案以MCGS触摸屏和…

视频云存储/安防监控EasyCVR视频汇聚平台如何通过角色权限自行分配功能模块?

视频云存储/安防监控EasyCVR视频汇聚平台基于云边端智能协同&#xff0c;支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。音视频流媒体视频平台EasyCVR拓展性强&#xff0c;视频能力丰富&#xff0c;具体可实现视频监控直播、视频轮播、视频录像、…

LLM生成式 AI 项目生命周期Generative AI project lifecycle

在本课程的其余部分中&#xff0c;您将学习开发和部署LLM驱动应用所需的技巧。在这个视频中&#xff0c;您将了解一个能帮助您完成此工作的生成式AI项目生命周期。此框架列出了从构思到启动项目所需的任务。到课程结束时&#xff0c;您应该对您需要做的重要决策、可能遇到的困难…

编写一个俄罗斯方块

编写俄罗斯方块 思路。 1、创建容器数组&#xff0c;方块&#xff0c; 2、下落&#xff0c;左右移动&#xff0c;旋转&#xff0c;判断结束&#xff0c;消除。 定义一个20行10列的数组表示游戏区。初始这个数组里用0填充&#xff0c;1表示有一个方块&#xff0c;2表示该方块固…

结构型(三) - 享元模式

一、概念 享元模式&#xff08;Flyweight Pattern&#xff09;&#xff1a;所谓“享元”&#xff0c;顾名思义就是被共享的单元。享元模式的意图是复用对象&#xff0c;节省内存&#xff0c;前提是享元对象是不可变对象。 优点&#xff1a;可以极大地减少内存中对象的数量&am…

mysql通过binlog日志恢复误删数据

1、先查看binlog功能是否开启 show variables like %log_bin%;log_bin为ON说明可以使用binlog恢复&#xff0c;如果为OFF说明没有开启binlog。 2、删除部分数据做测试 3、查找binlog文件位置 show variables like %datadir%;cd /var/lib/mysqlls -l删除数据时间是在文件154与…

redis数据类型详解+实例

redis中的数据类型&#xff1a; string&#xff0c;list, set, zset, hash,bitmaps, hyperloglog, gepspatial 目录 一、 String 二、List 三、Set 四、Zset 五、Hash 六、Bitmaps 七、Hyperloglog 八、Gepspatial 一、 String redis最基本的数据类型&#xff0c;一个…

微信小程序使用云存储和Markdown开发页面

最近想在一个小程序里加入一个使用指南的页面&#xff0c;考虑到数据存储和减少页面的开发工作量&#xff0c;决定尝试在云存储里上传Markdown文件&#xff0c;微信小程序端负责解析和渲染。小程序端使用到一个库Towxml。 Towxml Towxml是一个可将HTML、Markdown转为微信小程…