Shell脚本文本三剑客之sed编辑器(拥明月入怀,揽星河入梦)

news2024/11/18 15:46:20

文章目录

  • 一、sed编辑器简介
  • 二、sed工作流程
  • 三、sed命令
  • 四、sed命令的使用
    • 1.sed打印文件内容(p)
      • (1)打印文件所有行
      • (2)打印文件指定行
    • 2.sed增加、插入、替换行(a、i、c)
      • (1)a操作在指定行下增加行内容
      • (2)i操作在指定行上插入行内容
      • (3)c操作指定行替换为一行内容
    • 3.sed删除文件内容(d)
    • 4.sed替换文件内容(s)
    • 5.sed使用命令文件执行(-f)
    • 6.sed直接修改文件内容(-i)
    • 7.sed扩充操作
      • (1)替换处&代表需要替换内容处中正则表达式的内容
      • (2)替换处\1\...\n\ 对应需要替换内容处每个括号中子表达式(可以是字符串和正则)
      • (3)大小写转换
      • (4)将多个文件内容放在一个文件中
      • (5)复制、剪切粘贴行内容

一、sed编辑器简介

    sed是一种流编辑器,流编辑器会在编辑器处理数据前基于预先提供的一组规则来编辑数据。

sed编辑器可以根据命令来处理数据流中的数据,通过多种转换修改流经它的文本,这些命令要么从命令行中输入,要么存储在一个命令文本文件中。

sed是一个面向字符流的非交互式编辑器,也就是说 sed 不允许用户与它进行交互操作。

二、sed工作流程

1.读取
sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的内存缓冲区中(又称模式空间,pattern space)。

2.执行
默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。

3.显示
发送修改后的内容到输出流。在发送数据后,模式空间将会被清空。在所有的文件内容都被处理完成之前,上述过程将重复执行,直至所有内容被处理完。

注:默认情况下所有的sed命令都是在模式空间内执行的,不会影响到文件中的内容,除非是用重定向输出到文件或使用-i选项。

三、sed命令

sed [选项] 操作 文件名…

常用选项
在这里插入图片描述
常用操作
在这里插入图片描述

执行多个操作的方法

  • sed -e ‘操作1’ -e ‘操作2’ … 文件名
  • sed -e ‘操作1;操作2;…’ 文件名

四、sed命令的使用

1.sed打印文件内容(p)

(1)打印文件所有行

    sed本身有执行操作后自动打印的效果,-n禁用,p操作也可以打印,并且可以限定条件

sed ’ ’ 文件名
sed -n ‘p’ 文件名

//使用sed自动打印
[root@localhost1 sedtest]#sed '' file1
one
two
three
four
five
six
seven
eight
nine
ten
 
//使用sed的p操作打印
[root@localhost1 sedtest]#sed -n 'p' file1
one
two
three
four
five
six
seven
eight
nine
ten

(2)打印文件指定行

sed -n ‘指定条件p’ 文件名
sed -n ‘/字符串或正则表达式/p’ 文件名

//1.打印指定行(根据行号)
[root@localhost1 sedtest]#sed -n '2p' file1    //打印第2行
two
 
//2.打印指定的多行(根据行号)
[root@localhost1 sedtest]#sed -n '7,$p' file1    //打印从第7行到末尾行
seven
eight
nine
ten
 
//3.打印多行后退出
[root@localhost1 sedtest]#sed '3q' file1    //从头打印3行后退出
one
two
three
 
//4.打印指定行(根据字符串)
[root@localhost1 sedtest]#sed -n '/ve/p' file1    //根据字符串s
five
seven
 
//5.从指定行打印到包含指定字符串的行(根据字符串)    
[root@localhost1 sedtest]#sed -n '7,/nobody/p' /etc/passwd    //打印7到包含nobody的行
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/nologin
 
 
//6.打印奇偶行
[root@localhost1 sedtest]#sed -n 'n;p' file1    //n表示跳到下一行,先n实现输出偶数行
two
four
six
eight
ten
[root@localhost1 sedtest]#sed -n 'p;n' file1    //后n实现奇数行
one
three
five
seven
nine
 
//7.正则表达式表示
//根据root开头或包含mail的输出行(包含扩展正则时sed一定需要加-r选项)
[root@localhost1 sedtest]#sed -nr '/^root|mail/p' /etc/passwd
root:x:0:0:root:/root:/bin/bash
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
 
//从第8行打印到包含(r 至少有一个a t)的字符串的行
[root@localhost1 sedtest]#sed -nr '8,/ra{1,}t/p' /etc/passwd
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
 

2.sed增加、插入、替换行(a、i、c)

(1)a操作在指定行下增加行内容

sed ‘指定行范围a 指定内容’ 文件名

//指定第2行下增加行内容
[root@localhost1 ~]#sed '2a ABC' file1
One Two Three
Four Five Six
ABC
Seven Eight Nine
Ten Eleven Twelve
 
//指定2到4行每行下增加行内容
[root@localhost1 ~]#sed '2,4a ABC' file1
One Two Three
Four Five Six
ABC
Seven Eight Nine
ABC
Ten Eleven Twelve
ABC
 

(2)i操作在指定行上插入行内容

sed ‘指定行范围i 指定内容’ 文件名

//指定第2行上插入行内容
[root@localhost1 ~]#sed '2i ABC' file1
One Two Three
ABC
Four Five Six
Seven Eight Nine
Ten Eleven Twelve
 
//指定第1到3行上插入行内容
[root@localhost1 ~]#sed '1,3i ABC' file1
ABC
One Two Three
ABC
Four Five Six
ABC
Seven Eight Nine
Ten Eleven Twelve

(3)c操作指定行替换为一行内容

sed ‘指定行范围c 指定内容’ 文件名

//指定第3行替换为指定行内容
[root@localhost1 ~]#sed '3c ABC' file1
One Two Three
Four Five Six
ABC
Ten Eleven Twelve
 
//指定第3到4行替换为指定行内容(多行变为一行)
[root@localhost1 ~]#sed '3,4c ABC' file1
One Two Three
Four Five Six
ABC
 
//指定包含ve的行替换为指定行内容
[root@localhost1 ~]#sed '/ve/c ABC' file1
One Two Three
ABC
ABC
ABC

3.sed删除文件内容(d)

sed ‘指定条件d’ 文件名
sed ‘/字符串或正则表达式/d’ 文件名

//1.删除所有行(根据行号)
[root@localhost1 sedtest]#sed 'd' file1
 
//2.删除指定行(根据行号)
[root@localhost1 sedtest]#sed '1d' file1    //删除第1行
two
three
four
five
six
seven
eight
nine
ten
 
//3.删除指定的多行(根据行号)
[root@localhost1 sedtest]#sed '2,8d' file1    //删除2到8行
one
nine
ten
 
//4.删除空行
[root@localhost1 sedtest]#sed '/^$/d' /etc/fstab
#
# /etc/fstab
# Created by anaconda on Fri Jul 29 21:42:19 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=552d20a1-63f1-4209-af23-7bcdb31d1c84 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0
 
//5.删除指定的多行(根据字符串)
[root@localhost1 sedtest]#sed '/ve/d' file1    //删除包含ve的行
one
two
three
four
six
eight
nine
ten
 
//6.正则表达式表示
//删除结尾为bash或nologin的行
[root@localhost1 sedtest]#sed -r '/bash$|nologin$/d' /etc/passwd
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
 
//7.从包含第1个字符串的行开始删除,到包含第2个字符串的位置停止删除
//(如果找不到第2个字符串的行,则删到最后一行)
[root@localhost1 sedtest]#sed '/one/,/five/d' file1    //从含one的行删到含five的行
six
seven
eight
nine
ten
 
[root@localhost1 sedtest]#sed '/thr/,/no/d' file1    //从含thr的行开始删,匹配不到含no的行,则删到最后
one
two
 
 
//8.反向删除(删除除了包含指定内容的行)
[root@localhost1 sedtest]#sed '/ve/d' file1    //删除除包含ve的行
five
seven
 

4.sed替换文件内容(s)

sed [选项] ‘行范围 s/旧字符串/新字符串/替换标记’ 文件名

4种替换标记
在这里插入图片描述

//1.不加范围,替换每行查找到的字符串
[root@localhost1 ~]#sed -n 's/root/admin/p' /etc/passwd
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin
 
//2.指定范围行,在指定行中替换n次(默认1次)
[root@localhost1 ~]#sed -n '/^root/ s/root/abc/p' /etc/passwd
abc:x:0:0:root:/root:/bin/bash
[root@localhost1 ~]#sed -n '/^root/ s/root/abc/2p' /etc/passwd
root:x:0:0:abc:/root:/bin/bash
 
//3.替换行中所有,使用g
[root@localhost1 ~]#sed -n '/^root/ s/root/abc/gp' /etc/passwd
root:x:0:0:root:/abc:/bin/bash
 
//4.指定行s/^/#/可以实现注释行内容
[root@localhost1 ~]#sed '2 s/^/#/' file1
one two three
#four five six
seven eight nine
ten eleven twelve
 
//5.指定行范围替换
[root@localhost1 ~]#sed '1,3 s/^/#/' file1
#one two three
#four five six
#seven eight nine
ten eleven twelve
 
//指定替换除为空可以实现将指定字符串删除
[root@localhost1 ~]#sed 's/#//' /etc/fstab
 
 /etc/fstab
 Created by anaconda on Fri Jul 29 21:42:19 2022
 
 Accessible filesystems, by reference, are maintained under '/dev/disk'
 See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
 
/dev/mapper/centos-root /                       xfs     defaults        0 0
UUID=552d20a1-63f1-4209-af23-7bcdb31d1c84 /boot                   xfs     defaults        0 0
/dev/mapper/centos-swap swap                    swap    defaults        0 0

5.sed使用命令文件执行(-f)

//编写文件包含sed的操作
[root@localhost1 ~]#vim script.txt
/^$/d
/e$/ s/^/#/
1,3 s/#//
 
//测试用文件
[root@localhost1 ~]#vim file2
#one
#two
#three
four
five
 
 
six
seven
eight
 
nine
ten
 
//sed指定文件操作
[root@localhost1 ~]#sed -f script.txt file2
#one
two
#three
four
five
six
seven
eight
#nine
ten

6.sed直接修改文件内容(-i)

//-i直接对文件进行操作
[root@localhost1 ~]#sed -i '/swap/ s/^/#/' /etc/fstab
 
//注释文件中包含swap的行
[root@localhost1 ~]#vim /etc/fstab
# /etc/fstab
# Created by anaconda on Fri Jul 29 21:42:19 2022
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/centos-root /                        xfs     defaults        0 0
UUID=552d20a1-63f1-4209-af23-7bcdb31d1c84 /boot  xfs     defaults        0 0
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

7.sed扩充操作

(1)替换处&代表需要替换内容处中正则表达式的内容

sed [选项] ‘行范围 s/正则表达式/&/替换标记’ 文件名

//这里的&代表.*swap.*匹配到的内容(即包含swap的行内容),在前面加上#可以实现注释行
[root@localhost1 ~]#sed -n 's/.*swap.*/#&/' /etc/fstab
#/dev/mapper/centos-swap swap                    swap    defaults        0 0

(2)替换处\1…\n\ 对应需要替换内容处每个括号中子表达式(可以是字符串和正则)

sed [选项] ‘s/(表达式1)…(表达式n)/\1\2…\n/’ 文件名

//原文件
[root@localhost1 ~]#cat file3
123456abcdef
 
//字符串子表达示,"\数字" 一一对应
[root@localhost1 ~]#sed 's/(123)(456)(abc)/\3\2\1/' file3
abc456123def
 
//正则子表达示,"\数字" 一一对应
[root@localhost1 ~]#sed -r 's/([0-9]{6})([a-z]{6})/\2\1/' file3
abcdef123456

(3)大小写转换

sed ‘s/[a-z]/\u&/g’ 文件名 (原字符范围前\b实现首字母转大写)
sed ‘s/[A-Z]/\l&/g’ 文件名

//原文件
[root@localhost1 ~]#cat file1
one two three
four five six
seven eight nine
ten eleven twelve
 
//1.全部转为大写
[root@localhost1 ~]#sed 's/[a-z]/\u&/g' file1
ONE TWO THREE
FOUR FIVE SIX
SEVEN EIGHT NINE
TEN ELEVEN TWELVE
 
[root@localhost1 ~]#sed -i 's/[a-z]/\u&/g' file1
 
//2.全部转为小写
[root@localhost1 ~]#sed 's/[A-Z]/\l&/g' file1
one two three
four five six
seven eight nine
ten eleven twelve
 
//3.锚定首字母,实现首字母大小写转换
[root@localhost1 ~]#sed 's/\b[a-z]/\u&/g' file1
One Two Three
Four Five Six
Seven Eight Nine
Ten Eleven Twelve

/U/对应子表达式位置数/E (结合第2条操作实现部分转大小写)

//部分转大小写,实现修改文件前缀名小写转大写
[root@localhost1 ~]#ls *.txt | sed -r 's/(.+)(\.txt)/\u\1\E\2/'    //u转开头
Abc.txt
A.txt
B.txt
Efg.txt
Number.txt
Script.txt
 
[root@localhost1 ~]#ls *.txt | sed -r 's/(.+)(\.txt)/\U\1\E\2/'    //U转全部
ABC.txt
A.txt
B.txt
EFG.txt
NUMBER.txt
SCRIPT.txt

(4)将多个文件内容放在一个文件中

sed -i ‘$r 文件1’ 文件2

//往fa、fb文件输入内容
[root@localhost1 ~]#echo 12345678 > fa
[root@localhost1 ~]#echo abcdefgh > fb
 
//合并文件内容到fb文件中
[root@localhost1 ~]#sed -i '$r fa' fb
[root@localhost1 ~]#cat fb
abcdefgh
12345678

(5)复制、剪切粘贴行内容

H 复制 ; G 粘贴

//原文件
[root@localhost1 ~]#cat file2
zhang san
li si
wang wu
zhao liu
qian qi
zhu ba
 
//1.复制粘贴到末尾
[root@localhost1 ~]#sed '1,2H;$G' file2
zhang san
li si
wang wu
zhao liu
qian qi
zhu ba
 
zhang san
li si
 
//2.剪切粘贴到末尾
[root@localhost1 ~]#sed '1,2{H;d};$G' file2
wang wu
zhao liu
qian qi
zhu ba
 
zhang san
li si

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

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

相关文章

【C++】类和对象()

😁作者:日出等日落 🔔专栏:C 当你的希望一个个落空,你也要坚定,要沉着! —— 朗费罗 前言 面向过程和面向对象初步认识 C语言是面向过程的,关注…

矿井水除氟系统CH-87的技术详解

今天,文章中会谈到的问题是关于煤化工废水深度处理除氟、总氮、砷等污染物工艺技术的拆解分析,用什么样的工艺技术能把矿井水中的氟、砷、总氮做到1个毫克升以下的标准符合达标排放?希望能对相关行业起到一定的帮助作用。我国是一个资源丰富的…

【开源项目】Disruptor框架介绍及快速入门

Disruptor框架简介 Disruptor框架内部核心的数据结构是Ring Buffer,Ring Buffer是一个环形的数组,Disruptor框架以Ring Buffer为核心实现了异步事件处理的高性能架构;JDK的BlockingQueue相信大家都用过,其是一个阻塞队列&#xf…

视觉错觉图像可逆信息隐藏

—————————————————————————————————————————————————————————— 文献学习:视觉错觉图像可逆信息隐藏 [1] Jiao S , Jun F . Image steganography with visual illusion[J]. Optics Express, 2021, 29(10…

【算法与数据结构】栈

栈 栈:结构定义 放入元素是从底向上放入 有一个栈顶指针,永远处在栈顶的元素 还需要标记栈大小的size 栈的性质: Fisrt-in Last-out (FILO) 先进后出 栈改变元素的顺序 栈:出栈 让栈顶指针向下移动一位 栈:入栈 …

【JavaEE】SpringMVC

目录 SpringMVC 获取连接 RequestMapping / GetMapping... 获取参数 获取querystring中的参数(获取表单数据基本相同) 获取URL中的参数 获取JSON对象 获取文件(通过表单) 获取Cookie 获取Header 获取Session 返回数据 返回数据 返回JSON对象 返回静态页面 请求…

云渲染时可以关机吗_云渲染电脑可以关闭吗?

云渲染可简单理解为放在云端的渲染农场,可区别于用户本地自己搭建的小型私有农场,用户只需将自己制作好的项目文件进行打包,通过 云渲染平台提供的客户端或网页端将文件上传到云端进行渲染。很多用户通过云渲染作业,解放了自己本地…

深耕5G+AIoT产业赛道,2023高通&美格智能物联网技术开放日隆重举行

5月11日,高通技术公司携手美格智能联合举办了“高通&美格智能物联网技术开放日”深圳站活动。大会现场,智能物联网行业合作伙伴齐聚一堂,围绕5GAIoT前沿技术,通过大咖专业的技术分享、落地应用介绍和现场丰富的产品展示&#…

Pytorch nn.Softmax(dim=?) 详解

本文参考自:Pytorch nn.Softmax(dim?) - 知乎 原文写得很好了,我这边另外完善了一些细节,让大家理解地更加直白一些。 可以先去看上面的参考文章,也可以直接看我这篇。 目录 1、tensor1 1)已知该矩阵的维度为&am…

vue实现聊天框自动滚动

需求 1、聊天数据实时更新渲染到页面 2、页面高度随聊天数据增加而增加 3、竖向滚动 4、当用户输入聊天内容或者接口返回聊天内容渲染在页面后,自动滚动到底部 5、提供点击事件操控滚动条上下翻动 环境依赖 vue:vue…

两小时搭建属于自己的chatGPT(ChatGLM)免硬件(白嫖)

目录 准备(注册): 搭建: API模式: 测试: 总结: 准备(注册): 注册modelscope(白嫖)免费使用服务器 https://modelscope.cn/ 按照图片里的选择(选择其他好像不能创建成功) 可以白嫖60多个小时的配置 8…

Java 8 Time 关于java.time包中你可能不知道的使用细节

目录 前言一、时区与时间1. 世界标准时:UTC、GMT、UT2. 地区时:Asia/Shanghai、UTC83. 时区:ZoneId、TimeZone4. 时间偏移量:ZoneOffset5. 时区简称:CTT、PRC 二、主要时间类1. 重要时间接口:Temporal2. 时…

【CocosCreator入门】CocosCreator组件 | Collider(碰撞)组件

Cocos Creator是一款流行的游戏开发引擎,具有丰富的组件和工具,其中碰撞系统组件是该引擎的重要组成部分。该组件可用于检测游戏中各个元素之间的碰撞,例如玩家角色与敌人、子弹与障碍物等。 目录 一、组件介绍 二、组件属性 2.1BoxCollid…

基于SpringBoot+微信小程序的农产品销售平台

基于SpringBoot微信小程序的农产品销售平台 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目…

Test Doubles测试替身: Testing in Distributed Systems and Real World

什么是Test Doubles In software testing, we developed unit tests and integration tests to test the codes functionality. However, in the real world, it is very common for a piece of code to interact with external components, for example, databases, public A…

【人工智能概论】pyplot作图中文显示、逐点坐标显示、保存图像

【人工智能概论】pyplot作图中文显示、逐点标记、保存图像 文章目录 【人工智能概论】pyplot作图中文显示、逐点标记、保存图像一. 简单的绘图二. 逐点坐标显示三. 中文显示四. 中文显示可能遇到的问题——缺少字体4.1 下载 SimHei.ttf4.2 复制 SimHei.ttf 到 Matplotlib 的 fo…

好的Robots.txt设计对Google收录有很大的帮助

Robots.txt 文件是用于指导搜索引擎爬虫在网站上爬行的标准。正确地设计 Robots.txt 文件可以帮助 Google 爬虫更好地理解您的网站结构,从而提高您的网站在 Google 搜索引擎上的收录率。 以下是一些设计 Robots.txt 文件的技巧,可以帮助 Google 爬虫更好…

security 报错:There is no PasswordEncoder mapped for the id “null“

security在登录的时候 无法登录成功 首先解读错误 下面百度翻译 安全框架设置了登录验证 说你没有密码编辑器 解决方法 一: 往容器中注册一个PasswordEncoder 解决方法二: 设置用户权限和角色的时候添加方法,加进去一个PasswordEncoder 只需要解决方案的话 下面的内容…

K8S系列之污点和容忍度详细分析

架构图 本篇文档主要介绍污点和容忍度的关系。 污点和容忍度 污点顾名思义就是脏的东西,给节点添加污点来限制pod调度到该节点上,如果pod可以容忍这种污点就可以被调度到有污点的节点上,如果不能容忍就不能被调度到该节点上。 污点作用于节…

排队领奖模式吸引新消费者,电商平台如何创新引流拓客?

在当前的电商市场中,由于竞争日趋激烈,很多电商平台产生了引流拓客缺乏新意的难题,即很难找到新的流量,并且难以把这些流量转化为消费者。在这个瞬息万变的时代,当然是谁有创意谁能吸引消费者,谁才能当道。…