Linux文本之sed流编辑器

news2024/11/24 16:44:29

一、sed的相关知识及其工作流程

1)sed编辑器的介绍

sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等

2)sed 流编辑器的工作过程

sed的工作流程主要包括读取、执行和显示三个过程:

  • 读取: sed从输入流 (文件、管道、标准输入) 中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space )
  • 执行: 默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行
  • 显示: 发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行, 直至所有内容被处理完

在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非使用"sed -i"修改源文件、或使用重定向输出到新的文件中 

3)怎么解决sed命令处理容量过大,或则内容过多的而导致执行效率慢的问题?

解决方案一(推荐用法):

使用split命令进行文件分割(例如文件如果是百万行,就创建一个单独的目录将文件分割为一百个为一万行的文本)再使用sed命令进行处理,除了split分割,也可以使用一个遍历分割shell脚本进行执行

解决方案二:

使用cat  文件名|sed  处理     (但是该方案只能针对中大型的文件文本,如果文本量过大,处理效果不好)

二、sed命令格式与选项操作符

1)sed命令格式

 基本操作格式: 

  • sed -e '操作'  文件1   文件2  
  • sed -n -e '操作'   文件1   文件2
  • sed -f   脚本文件   文件1  文件2
  • sed -i -e '操作'  文件1  文件2
  • 执行多条命令的格式:

    方式一: 

    sed -n -e '操作1' -e '操作2' 文件  ​

    方式二: 

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

    方式三:

    sed -e 'n{  
    
    操作1  
    
    操作2  
    
    ......  
    
    }' 文件1

2)sed命令的常用选项

选型作用
-e 或--expression=表示用指定命令来处理输入的文本文件,只有一个操作命令时可省略,一般在执行多个操作命令使用
-f 或--file=表示用指定的脚本文件来处理输入的文本文件
-h 或--help显示帮助
-n、--quiet或--silent禁止sed编辑器输出,但可以与p命令一起使用完成输出
-i直接修改目标文本文件

 3)sed命令的操作符 

操作符作用
s替换,替换指定字符
d删除,删除选定的行
a增加,在当前行下方增加一行指定内容
i插入,在选定行上方插入一行指定内容
c替换,将选定行替换为指定内容
y字符转换,转换前后的字符长度必须相同
p打印行内容。如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以ASCII码输出。其通常与"-n"选项一起使用
=打印行号
l (小写L)打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)

三、 sed命令的打印功能

1)默认打印方式

无要求的默认打印

[root@localhost sed]#sed -e 'p'  english.txt 
 
 
[root@localhost sed]#sed -n 'p'  english.txt 

打印时对行号的操作

[root@localhost sed]#sed -n '=' english.txt 
 
 
[root@localhost sed]#sed -n '=;p' english.txt 

sed命令的寻址打印

①以数字形式打印行区间

方式一:按照行号寻求内容

[root@localhost sed]#sed -n '1p'  english.txt 
 
[root@localhost sed]#sed -n '4p'  english.txt 
 
[root@localhost sed]#sed -n '$p'  english.txt 

方式二:进行行号范围区间的打印

[root@localhost sed]#sed -n '1,3p' english.txt 
 
[root@localhost sed]#sed -n '5,$p' english.txt 
 
[root@localhost sed]#sed -n '5,+2p' english.txt 
 
[root@localhost sed]#sed -e '5q' english.txt 

 

 方式三:指定间隔打印

[root@localhost sed]#sed -n -e '5p' -e'$p'  english.txt 
 
 
[root@localhost sed]#sed -n -e '2p' -e'3p'  english.txt 

 

方式四:对奇数行和偶数行的打印 

[root@localhost sed]#sed -n 'n;p'  english.txt 
 
[root@localhost sed]#sed -n 'p;n'  english.txt 

②文本模式过滤行内容

方式一:对包含的字符串进行过滤打印

[root@localhost sed]#sed -n '/o/p' english.txt 
 
[root@localhost sed]#sed -n '/th/p' english.txt 

 

 方式二:应用基础正则表达式进行打印

[root@localhost sed]#sed -n  '/^root/p'   /etc/passwd
 
[root@localhost sed]#sed -n  '/bash$/p'   /etc/passwd
 
[root@localhost sed]#sed -n  '4,/bash$/p'   /etc/passwd

方式三:使用扩展正则表达式进行打印

注意: 

sed -r 支持扩展正则表达式。同时在 使用{n}、{n,}、{n,m}时,括号{}前不需要加反斜杠\ 

[root@localhost sed]#sed -r -n  '/(99:){2,}/p'   /etc/passwd
 
[root@localhost sed]#sed -r -n  '/^root|bash$/p'   /etc/passwd

四、sed的删除操作 

注意: 

以下的操作均为在默认情况下操作,有测试的效果,sed  -i   时会对文本进行实际操作(建议对目标文件先进行备份,再进行操作)

 1)通过行号进行删除

[root@localhost sed]#sed -n '3d;p' english.txt 
 
[root@localhost sed]#sed -n '5,8d;p' english.txt 
 
[root@localhost sed]#sed -n '5,$d;p' english.txt 

 

[root@localhost sed]#sed   '4,6!d'   english.txt 

 

 2)匹配字符串内容删除

[root@localhost sed]#sed   '/one/d'   english.txt 
 
[root@localhost sed]#sed   '/one/,/six/d'   english.txt 

[root@localhost sed]#sed   '/one/,/six/!d'   english.txt 
 
[root@localhost sed]#sed   '/six/!d'   english.txt 

 

 3)字符串搭配正则进行删除

[root@localhost sed]#sed   '/^$/d'   english.txt 

删除空行的三种方法:

  1. grep -v "^$" file.txt //过滤出非空行
  2. cat file.txt |tr -s "\n" //压缩换行符
  3. sed '/^$/d' file.txt //删除空行

 五、sed命令替换

格式:

行范围 s/旧字符串/新字符串/替换标记


替换标记:

数字:表明新字符串将替换第几处匹配的地方  

g:表面新字符串将会替换所有匹配的地方

p:打印与替换命令匹配的行,与-n一起使用

w 文件:将替换的结果写入文件中 

 
sed命令的替换中:

s:替换字符串

c:整行替换

y:字符替换,替换前后的字符串长度必须相同

1)字符串的替换 

匹配单字符进行替换

[root@localhost sed]#sed -n 's/root/test/2p'  /etc/passwd
 
[root@localhost sed]#sed -n 's/root/test/gp'  /etc/passwd

[root@localhost sed]# sed -n '/^root/ s/^/#/p'   /etc/passwd

 

2)进行字母字符进行大小的替换 

大写转换为小写 

[root@localhost sed]#sed -i 's/[A-Z]/\l&/g'  english.txt 

小写转换为大写

[root@localhost sed]#sed -i 's/[a-z]/\u&/'  english.txt 
 
[root@localhost sed]#sed -i 's/[a-z]/\U&/'  english.txt 

[root@localhost sed]#sed -i 's/[a-z]/\U&/g'  english.txt 

3)知识扩充  “//”是可以被其他符号所替换的

经典分隔符转换案例

此时9代替/的作用,加上\才为数字9,否则为分隔符

4)整行替换

使用c进行替换,是对整行内容进行替换

[root@localhost sed]# sed '/ONE/c 22' english.txt 
 
[root@localhost sed]# sed '/TWO/c TEST' english.txt 
[root@localhost sed]# sed 'y/TH/12/' english.txt 

5)单字符的替换 

#使用y,是对单个字符进行替换,每个字符需要一一对应,不是整体替换。前后字符串长度需要一致,不然会报错

[root@localhost sed]# sed 'y/TH/12/' english.txt 

 六、sed命令的增加

a:在行后添加内容

i:在行前插入内容

r:在行后读入文件内容

1)sed 命令行插入 

[root@localhost sed]# sed '/THREE/a  123 ' english.txt 
 
[root@localhost sed]# sed '/THREE/i  123 ' english.txt 

2)sed命令行后读取文件插入

[root@localhost sed]#sed  '$r english2.txt'  english.txt

 七、sed 命令进行复制粘贴

#H复制、d删除、G粘贴到指定行下方

[root@localhost sed]#sed  '1,3 {H;G};$G' english.txt 
 
[root@localhost sed]#sed  '1,3 {H;d};$G' english.txt 

八、sed命令中字符串和字符的位置交换

[root@localhost sed]#echo 123abc|sed -r 's/(123)(abc)/\2\1/'

[root@localhost sed]#echo 123abc|sed -r 's/(.)(.)(.)(.)(.)(.)/\6\5\4\3\2\1/'

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

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

相关文章

使用HDFS底层文件进行HBase跨集群数据迁移

目录 一、概述 二、环境信息 三、HBCK2下载和编译 四、具体操作步骤 4.1 数据同步 4.2 添加元数据 4.3 重新分配region 一、概述 客户集群机房迁移,我们部署的集群也要完成跨集群迁移hbase 表,这里选择迁移Hadoop底层数据来实现hbase的表迁移。 …

Plant Simulation 模型保存历史记录

Plant Simulation 建模是一个长时间的过程,所以做好模型保存历史记录很重要,这次分享一个OOTB(开盒即用/系统自带)的记录保存历史记录的功能。 文中截图于 Plant Simulation 16.0.5 目录 1.功能设置与说明2.使用场景3.总结 1.功能…

Selenium自动化测试中的PageObject模式

PageObject模式简介 众所周知,UI页面元素常常是不稳定的,在使用Selenium编写WebUI自动化测试用例时,随着测试脚本的增加,维护和更新这些元素便成为一个令人头疼的问题。 在普通模式下,脚本直接定位并操作元素&#xf…

链表中的经典问题

一、反转链表 反转一个单链表:一种解决方案是按原始顺序迭代结点,并将它们逐个移动到列表的头部。 方法1:迭代 C struct ListNode* reverseList(struct ListNode* head) {struct ListNode* prev NULL;struct ListNode* curr head;while (curr) {struct ListN…

字节跳动软件测试面试记:二面被按地上血虐,所幸Offer已到手

在互联网做了几年之后,去大厂“镀镀金”是大部分人的首选。大厂不仅待遇高、福利好,更重要的是,它是对你专业能力的背书,大厂工作背景多少会给你的简历增加几分竞争力。 但说实话,想进大厂还真没那么容易。最近面试字…

Linux中与“系统网络状态”相关的内核数据结构

六、系统网络状态相关的数据结构 6.1 ifconf \linux-2.6.32.63\include\linux\if.h /* Structure used in SIOCGIFCONF request. Used to retrieve interfaceconfiguration for machine (useful for programs which must know allnetworks accessible). */ struct ifcon…

腾讯云与中电金信发布联合核心方案

5月11日,以“聚力革新,行稳致远”为主题的 “腾讯金融云国产化战略峰会”在北京举办,来自金融业、科技侧、研究机构的专家学者同聚一堂,共同探讨银行核心下移方法论以及国产化转型实践等话题。会议期间,中电金信副总经…

Java面试(2)数据类型

数据类型 1. Java有哪些数据类型 Java基本数据类型 这八种基本类型都有对应的包装类分别为:Byte、Short、Integer、Long、Float、Double、Character、Boolean 。 引用数据类型 引用数据类型非常多,大致包括:类、 接口类型、 数组类型、 枚…

AI低代码平台遍地开花,AI对于低代码到底是帮手还是对手?

AI对于低代码平台到底是帮手还是对手? 近日,CSDN举办的新程序员大会中,对于AI在代码领域的能力进行了5个层级的定义。并且进行了大量的测试,发现当下的AI已经可以去到初级程序员了,而更为强大的GPT-4的代码能力甚至还有…

Goby 漏洞更新 | 铭飞 CMS list 接口 sqlWhere 参数 sql 注入漏洞

漏洞名称:铭飞 CMS list 接口 sqlWhere 参数 sql 注入漏洞 English Name:MCMS list Interface sqlWhere Sql Injection Vulnerability CVSS core: 7.5 影响资产数:3091 漏洞描述: MCMS 是一套基于 java 开发的轻量级开源内容…

【时空权衡】

目录 知识框架No.0 时空权衡一、基本思想 No.1 计数排序二、分布计数 No.2 散列法 知识框架 No.0 时空权衡 一、基本思想 其实时空权衡:是指在算法的设计中,对算法的时间和空间作出权衡。 本文主要是是用空间来换时间的。(应该是这样吧) 对问题的部分或…

同样是做大模型的科技公司,为啥差距这么大呢?

2022年OpenAI亏了30多亿元, 站在风口上,谁的压力会小呢? 【科技明说 | 每日看点】站在风口上。OpenAI公司在2022年亏得十分“灿烂”,和往年同比几乎翻了一倍,亏损约达5.4亿美元,折合人民币约31…

微服架构基础设施环境平台搭建 -(五)Docker常用命令

微服架构基础设施环境平台搭建 -(五)Docker常用命令 本文主要列出了Docker常用的命令 微服架构基础设施环境平台搭建 系列文章 微服架构基础设施环境平台搭建 -(一)基础环境准备 微服架构基础设施环境平台搭建 -(二&am…

富文本输出如何避免XSS

有时网站为了美观,会允许用户输入一些富文本,这样在显示的时候,就可以显示的更友好。虽然在输入富文本的时候在客户端进行了控制,但是,仍然难易避免一些攻击者通过抓包篡改数据绕过客户端的控制。因此,在服…

【飞行棋】多人游戏-微信小程序开发流程详解

可曾记得小时候玩过的飞行棋游戏,是90后的都有玩过吧,现在重温一下,这是一个可以二到四个人参与的游戏,通过投骰子走棋,一开始靠运气,后面还靠自己选择,谁抢占先机才能赢,还可以和小…

Redis 三大特殊数据类型常见命令

Geospatial 朋友的定位,附近的人,打车距离计算 底层是 Zset,即可以使用Zset的命令操作Geospatial Redis3.2 开始支持的 1.添加地理位置 两极无法添加经度:-180 ~ 180(度)纬度:-85.05112878 ~ 8…

一、RestTemplate的使用

目录 1、新建项目springcloud(File--->New--->Project) 使用maven quickstart快速新建Maven项目 输入项目名称和Maven信息 确认Maven目录、配置文件、本地仓库,Finish即可 2、创建聚合项目springcloud-member、springcloud-order(项…

【人力资源管理】第2集 免费开源ERP: Odoo 16 Recruitment招聘管理 构建一体化企业人力资源管理

文章目录 前言一、概览二、主要功能1.组织空缺职位和职位申请2.追踪工作机会(查看哪个渠道收到的申请最多)3.定制您的招聘流程4.集成文档(定义您自己的文件管理流程)5.与Odoo应用程序完全集成 总结 前言 轻松处理您的招聘流程。 …

C++ 中到底是应该include .h文件还是应该include .cpp文件

在阅读一个较大的解决方案中,对于其他文件夹下的.h和.cpp文件,有时候#include“XXX.h”文件,有时候是#include“XXX.cpp”文件,而且二者还不能更换。下面就好好分析一下他们二者的区别。 测试 测试:XXX.h和XXX.cpp…

连接器:一种可靠耐用、节约成本的同为科技(TOWE)工业连接器

随着我国经济建设水平的飞速发展,工业连接器被广泛应用于工业、化工、机场、船舶、码头、建筑、铁路、医疗、会展、商业演出等领域。工业连接器的作用是用于连接一个电路导体与另一个电路导体、或一个传输元件与另一个传输元件的装置,并且为两个电路子系…