Shell系统编程三剑客之----sed编辑器

news2024/11/30 5:00:12

目录

一:sed编辑器

1.sed编辑器概述

2.sed的工作流程

3.sed的命令格式

4.常用选项

5.常用操作

二:sed操作事例

1.查询

(1)打印内容

​(2)打印行数

​(3)打印特殊字符、ASCII码 

 (4)打印指定行数

​(5)配合正则表达式查询打印

2.删除

(1)删除行

(2)指定删除数

 3.替换

(1)4种替换标记

 (2)-f  :调用文件

 (3)w 替换到指定文件中

 (4)c :整行替换

(5)y :转换

4.插入

(1)a:行下插入

(2)i:行上插入

​(3)r :读取、合并

 (4)H :   复制    G :  粘贴

(5)剪切

(6)位置调换


一:sed编辑器

1.sed编辑器概述

  • sed是一种流编辑器,流编辑器会在编辑器处理数据之前基于预先提供的一组规则来编辑数据流。
  • sed编辑器可以根据命令来处理数据流中的数据,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

2.sed的工作流程

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

3.sed的命令格式

格式1:sed  -e  ‘操作’  文件1 文件2 ......

格式2:sed  -n -e  '操作'   文件1  文件2 .......

格式3:sed  -f  脚本文件   文件1  文件2 .......

格式4:sed  -i  -e  '操作'  文件1  文件2.......

格式5:
sed  -e  ' n {
操作1 
操作2 
.......
}'  文件1  文件2......

4.常用选项

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

5.常用操作

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

二:sed操作事例

1.查询

(1)打印内容

#-n和-p一起使用表示打印一次内容,如果不加-n,则打印两次内容
[root@localhost ~]# sed -n -e 'p' a
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

 (2)打印行数

[root@localhost ~]# cat a | sed -n '='
1
2
3
4
5
6
7
8
9
10
11
12
[root@localhost ~]# cat a | sed -n '=' |tail -1
12
[root@localhost ~]# cat a | wc -l
12

[root@localhost ~]#sed -e '=' testfile1       #如果不加 -n 的话就是既打印出了行号也打印出了内容
[root@localhost ~]#sed -n '=;p' testfile1     #结果和上面一样,既打印行号也打印内容
[root@localhost ~]#sed -n -e '=' -e 'p' testfile1     #结果和上面一样,表示先打印行号再打印内容
[root@localhost ~]# cat a | sed -n -e '=' -e 'p'
1
one
2
two
3
three
4
four
5
five
6
six
7
seven
8
eight
9
nine
10
ten
11
eleven
12

 (3)打印特殊字符、ASCII码 

#加 -l 是打印ASCII字符
[root@localhost ~]# cat a | sed -n 'l'
one$
two$
three$
four$
five$
six$
seven$
eight$
nine$
ten$
eleven$
twelve$

 (4)打印指定行数

[root@localhost ~]# sed -n '4p' a           #打印第4行
four
[root@localhost ~]# sed -n '$p' a           #打印最后一行,$为最后一行
twelve
[root@localhost ~]# sed -n '1,9p' a         #打印1-9行
one
two
three
four
five
six
seven
eight
nine
[root@localhost ~]# sed -n '1,+5p' a        #打印1+5行
one
two
three
four
five
six
[root@localhost ~]# sed '6q' a              #打印6行
one
two
three
four
five
six
[root@localhost ~]# sed -n 'p;n' a           #打印奇数行
one
three
five
seven
nine
eleven
[root@localhost ~]# sed -n 'n;p' a            #打印偶数行
two
four
six
eight
ten
twelve
[root@localhost ~]# sed -n '1 {p;n;n;p}' a    #从第1行开始,n为自动调下一行
one
three
[root@localhost ~]# sed -n '6,${n;p}' a       #从第6行开始,n为自动调下一行,到最后一行
seven
nine
eleven

  (5)配合正则表达式查询打印

[root@localhost ~]# sed -n '/root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
[root@localhost ~]# sed -n '/^root/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
[root@localhost ~]# sed -n '/bash$/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
qhw:x:1000:1000:qhw:/home/qhw:/bin/bash
[root@localhost ~]# sed -nr '/root|ftp/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]# sed -n '2,/ftp/p' /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
[root@localhost ~]# sed -n '2,/ftp/=' /etc/passwd
2
3
4
5
6
7
8
9
10
11
12

2.删除

(1)删除行

[root@192 ~]# sed '3d' a                   #删除第三行
one
two
four
five
six
seven
eight
nine
ten
eleven
twelve
[root@192 ~]# sed '3,5d' a               #删除3-5行
one
two
six
seven
eight
nine
ten
eleven
twelve
[root@192 ~]# sed 'd' a                  #文件内容全删

(2)指定删除数

[root@192 ~]# sed '/bash$/!d' /etc/passwd            #删除不以bash结尾的行
root:x:0:0:root:/root:/bin/bash
qhw:x:1000:1000:qhw:/home/qhw:/bin/bash

[root@192 ~]# sed -r '/^(bash)$/d' /etc/passwd       #删除不以bash结尾的行
root:x:0:0:root:/root:/bin/bash

[root@192 ~]# cat aa | sed '/3/d'                        #删除3
1
2
10
15
55
110
120
255
555

[root@192 ~]# cat aa | sed -r '/2|3/d'                   #删除2或3,循环删
1
10
15
55
110
555

[root@192 ~]# cat aa | sed '/2/,/20/d'                   #当没有那么多行时,会删除的就剩一行
1

 3.替换

(1)4种替换标记

数字表明新字符串将替换第几处匹配的地方
g表明新字符串将会替换所有匹配的地方
p打印与替换命令匹配的行,与-n一起使用
w 文件将替换的结果写到文件中
#将第一个root替换成admin
[root@192 ~]# sed -n 's/root/admin/p' /etc/passwd 
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

#将第二个root替换成admin
[root@192 ~]# sed -n 's/root/admin/2p' /etc/passwd 
root:x:0:0:admin:/root:/bin/bash

#将root都替换成admin
[root@192 ~]# sed -n 's/root/admin/gp' /etc/passwd 
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin

#将分割符全部替换为空
[root@192 ~]# sed -n 's/root//gp' /etc/passwd 
:x:0:0::/:/bin/bash
operator:x:11:0:operator:/:/sbin/nologin

#将分割符替换为空格
[root@192 ~]# sed -n 's/root/ /gp' /etc/passwd 
 :x:0:0: :/ :/bin/bash
operator:x:11:0:operator:/ :/sbin/nologin

#将文件内1-20行前面加#号
[root@192 ~]# sed -n '1,20 s/^/#/p' /etc/passwd

##表示将匹配到的整行文本以#开头进行注释,&表示匹配到的整行文本
[root@192 ~]#  sed -rn 's/.*root.*/#&/p' /etc/passwd
#root:x:0:0:root:/root:/bin/bash
#operator:x:11:0:operator:/root:/sbin/nologin

 (2)-f  :调用文件

sed -f c.sh a.txt    #对a.txt调用c.sh的规则

 (3)w 替换到指定文件中

#将前20行结果替换到指定文件中
[root@192 ~]# sed '1,20w d.txt' /etc/passwd 
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
nobody:x:99:99:Nobody:/:/sbin/nologi

 (4)c :整行替换

#将第一行替换为996
[root@192 ~]# sed '1c 996' a
996
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

#将最后一行替换为hello world
[root@192 ~]# sed '$c hello world' a
one
two
three
four
five
six
seven
eight
nine
ten
eleven
hello world

(5)y :转换

#将文件中o换为1,u换为2,r换为3
[root@192 ~]# sed 'y/our/123/' a
1ne
tw1
th3ee
f123
five
six
seven
eight
nine
ten
eleven
twelve

4.插入

(1)a:行下插入

#第一行下插入123
[root@192 ~]# sed '1a 123' a
one
123
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

#1-6行下插入123
[root@192 ~]# sed '1,6a 123' a
one
123
two
123
three
123
four
123
five
123
six
123
seven
eight
nine
ten
eleven
twelve

 

(2)i:行上插入

#第一行上插入123
[root@192 ~]# sed '1i 123' a
123
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

#最后一行上插入123
[root@192 ~]# sed '$i 123' a
one
two
three
four
five
six
seven
eight
nine
ten
eleven
123
twelve

 (3)r :读取、合并

#在a文件的最后一行后将aa文件读取结果显示出来
[root@192 ~]# sed '$r aa' a
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve
1
2
3
10
15
55
110
120
255
555
555
255
333
333

 (4)H :   复制    G :  粘贴

#1-3行复制,粘贴到最后一行
[root@192 ~]# sed '1,3H;$G' a
one
two
three
four
five
six
seven
eight
nine
ten
eleven
twelve

one
two
three

#1-3行复制,粘贴到10到最后一行后面
[root@192 ~]# sed '1,3H;10,$G' a
one
two
three
four
five
six
seven
eight
nine
ten

one
two
three
eleven

one
two
three
twelve

one
two
three

(5)剪切

#1-3行复制,剪切到最后一行
[root@192 ~]# sed '1,3{H;d};$G' a
four
five
six
seven
eight
nine
ten
eleven
twelve

one
two
three

#1-3行复制,剪切到10-最后一行
[root@192 ~]# sed '1,3{H;d};10,$G' a
four
five
six
seven
eight
nine
ten

one
two
three
eleven

one
two
three
twelve

one
two
three

 

(6)位置调换

[root@localhost ~]# echo '112233' 
112233

#分组调换位置
[root@localhost ~]#  echo '112233' | sed  -r 's/(11)(22)(33)/\3\2\1/'
332211

[root@localhost ~]#  echo '112233' 
112233

#第一位和最后一位调换
[root@localhost ~]#  echo '112233' | sed  -r 's/(.)(.*)(.)/\3\2\1/'
312231

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

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

相关文章

python爬虫简述

Python爬虫是一种自动化获取互联网数据的技术,它可以通过编写程序自动访问网站并抓取所需的数据。在本文中,我们将介绍Python爬虫的基础知识、常用库和实际应用。 一、Python爬虫的基础知识 爬虫的定义 爬虫是一种自动化获取互联网数据的技术&#xf…

屏幕录像怎么录?分享3个简单实用的方法!

案例:怎么录制电脑屏幕? 【对于我这种不太熟悉电脑的人来说,想要录制电脑屏幕十分困难。听说录制电脑屏幕,需要用到录屏工具。有没有小伙伴有好的录屏软件介绍,顺便附带一下教程!求!】 屏幕录…

【冶金轧钢、电厂 JL-8B/E集成电路电流继电器 CMOS运算 JOSEF约瑟】

JL-8B/E集成电路电流继电器名称:集成电路电流继电器型号:JL-8B/E触点容量250V5A功率消耗<5W返回系数过电流:0.90.97;欠电流:1.051.15整定范围0.03~60A 系列型号: JL-8A/E集成电路电流继电器; JL-8B/E集成电路电流继电器; JL-8A/E11-004集成电…

[离散数学]命题逻辑与推理

目录 主析取范式 主合取范式推理理论(假设前提条件为真推出的结论)真值表法直接证明法** 常用推理公式 ** 间接证明 CP规则--附加前提证明法,证明比较方便 单条件形式,提取前件间接法 归谬法 结论是单命题,取反前提引入 常用 latex 定义 主析…

Druid未授权漏洞进一步的利用

一、漏洞描述 Druid是阿里巴巴数据库出品的为监控而生的数据库连接池。并且Druid提供的监控功能包括监控SQL的执行时间、监控Web URI的请求、Session监控等。Druid本身是不存在什么漏洞的,但当开发者配置不当时就可能造成未授权访问。本文除了介绍Druid未授权漏洞之…

js 使用正则获取 html中 所有span标签

let html <p>艾迪莎测试但大家还是</p><h1>你好啊</h1><p>啊是多久啊合适的<span style"text-decoration: underline;">静安寺</span>大家哈圣诞节<span style"text-decoration: underline;">哈桑</s…

企业需要专业电子邮件地址的4大原因

专业的企业电子邮件地址具有贵公司的自定义域名&#xff0c;而不是通用的Zoho Mail 、gmail或yahoo帐户&#xff0c;例如&#xff1a;john stargardening.com 大多数初学者使用不带域名的通用免费企业电子邮件帐户&#xff0c;这不是很专业。例如&#xff1a;zhangsan2022zoho.…

从零开始Vue3+Element Plus后台管理系统(六)——状态管理Pinia和持久化

Pinia 官网&#xff1a;https://pinia.vuejs.org/zh/ Pinia 是 Vue 的专属状态管理库&#xff0c;相比Vuex更好用&#xff0c;优点不多了说官网有&#xff0c;用起来最重要&#xff01; 在应用的根部注入创建的 pinia // main.ts import { createApp } from vue import { c…

CLMP证书:让你在职场中脱颖而出的秘密武器!

CLMP证书是一种精益管理专业证书&#xff0c;是针对精益管理领域的专业人士和学生的培训项目&#xff0c;旨在提高他们在精益管理方面的技能和知识。那么&#xff0c;CLMP证书的含金量高吗&#xff1f;接下来我们来探讨一下。 CLMP证书的优势体现 首先&#xff0c;CLMP证书的…

Android Jetpack Compose之使用脚手架快速搭建APP布局结构

概述 现在市场上大多数的手机APP的通用布局结构都是顶部有个顶部导航栏&#xff0c;底部有个底部导航栏&#xff0c;例如抖音的布局结构&#xff1a; 点击导航栏里面的各个项又可以跳转到相应的页面&#xff0c;现在这种结构特别流行&#xff0c;如果我们使用传统的View来实现…

Web自动化测试-如何进行Selenium页面数据及元素交互?教你一步不漏。

目录 前言&#xff1a; 一、Selenium简介 二、安装Selenium 1.Windows用户安装Selenium 2.安装Chrome浏览器驱动 三、使用Selenium进行页面数据及元素交互 1.启动浏览器 2.访问网页 3.查找元素 4.输入文本 5.点击按钮 6.提交表单 四、完整代码示例 五、总结 Web自…

(MIT6.045)自动机、可计算性和复杂性-DFA和NFA

毕业论文写完了。找点事干干。 佛系更新。 这是一门讲述 什么是计算&#xff1f;什么能被计算&#xff1f;怎么高效计算&#xff1f; 的哲学、数学和工程问题的课程。 主要包括&#xff1a; 有限状态机&#xff08;Finite Avtomata&#xff09;&#xff1a;简单的模型。 可…

【OpenCV-Python】——机器学习kNN算法SVM算法k均值聚类算法深度学习图像识别对象检测

目录 前言&#xff1a; 1、机器学习 1.1 kNN算法 1.2 SVM算法&#xff08;支持向量机&#xff09; 1.3 k均值聚类算法 2、深度学习 2.1 基于深度学习的图像识别 2.2 基于深度学习的对象检测 总结&#xff1a; 前言&#xff1a; 机器学习&#xff08;ML&#xff09;是人…

Linux-权限

1. 认识Linux下用户的分类 root普通用户1.1用户切换 普通用户 转 root su //当前路径切换rootsu - //重新登陆到/root退出 crtl d / exit root 转 普通用户 不需要输入密码 su 用户名退出 ctrl d 1. 2 指令暂时提权 sudo command目前我们用adduser新建的用户&#xff0…

100个软件开发领域必须掌握的关键词,掌握一个都难啊

需要完整xmind文件&#xff0c;私信获取 100个软件开发领域必须掌握的关键词 基础编程语言 JavaPythonC#JavaScriptPHPRubyCObjective-CSwiftKotlin Web 开发 HTMLCSSJavaScriptReactAngularVue.jsjQueryBootstrapNode.jsExpress.js 移动应用开发 AndroidiOSFlutterRea…

100万数据,如何快速的导入数据库?

数据导出、导入是非常常见的开发操作&#xff0c;但在这个过程中&#xff0c;很多开发者都会遇到诸如数据乱码、数据格式不支持、数据量太大等问题。NineData 最新发布的数据导入功能&#xff0c;帮助用户在保障数据完整和准确的同时&#xff0c;轻松地将大量的数据从文件中导入…

利用项目管理工具实现项目日程安排:技巧与步骤详解

到 2022 年&#xff0c;我们可能会发现自己在思考过去的生活&#xff0c;以及我们的工作常规是否会回到原来的样子。我们中的一些人觉得我们过去常常完成更多的工作&#xff0c;而且我们中的许多人都在努力保持精神健康&#xff0c;同时保持工作效率。平衡我们的工作生活和个人…

深兰科技|功能迭代!metamind APP发布v1.2版本

以目前AI的技术水平&#xff0c;只要样本足够多&#xff0c;模仿一个人的面容、声音、语气&#xff0c;可以达到相似度90%以上。假设未来科技足够发达&#xff0c;能够通过记录一个人一生的数据来“复活”他&#xff0c;你会怎么选择&#xff1f;而如果你没有足够多的属于自己的…

如何利用python调用API接口获取数据进行测试

一、Python 可以使用 requests 库来调用 API 接口获取数据。以下是基本的步骤&#xff1a; 1.安装 requests 库 pip install requests 2.导入 requests 库 import requests 3.构建 API 请求的 URL 根据 API 文档&#xff0c;构建请求的URL。 例如&#xff0c; https://a…

C++——STL之空间配置器

文章目录 1. 什么是空间配置器2. 为什么需要空间配置器3. SGI-STL空间配置器实现原理3.1 一级空间配置器3.2 二级空间配置器3.2.1 内存池 3.3 空间配置器的再次封装3.4 对象的构造与释放 4. 与容器结合 1. 什么是空间配置器 空间配置器&#xff0c;顾名思义就是为各个容器高效…