第八章 shell编程之sed

目录

1.1. 概念

1.1.1. 工作原理:

1.2. 基本语法

1.2.1. 格式

1.2.2. 参数

1.2.3. 定址符

1.2.4. 操作

1.3. 输出文本

1.3.1. 范例文件:

1.3.2. 示例

1.4. 文本替换

1.4.1. 范例文件

1.4.2. 格式:

1.4.3. 示例

1.5. 删除文本

1.5.1. 注意

1.5.2. 示例

1.6. 插入文本

1.6.1. 注意

1.6.2. 格式

1.6.3. 示例1

1.6.4. 注意

1.7. 练习


1.1. 概念

sed命令是一个非交互式的文本编辑器,是将一系列的编辑命令应用于一批文本的理想工具,可以对来自文本文件以及标准输入的文本进行编辑。其中,标准输入可以是来自键盘、文件重定向、字符串、变量或者是管道的文本

sed命令拥有非交互式和高效的特点,可以为用户节约大量的时间

Vim 采用的是交互式文本编辑模式,可以用键盘命令来交互性地插入、删除或替换数据中的文本。但 sed命令不同,它采用的是流编辑模式,最明显的特点是,在 sed 处理数据之前,需要预先提供一组规则,sed 会按照此规则来编辑数据

1.1.1. 工作原理:

模式空间pattern space:sed在内存里开辟模式空间,处理文件的每个输入行,最多8192字节

保留空间holding space:sed在内存里开辟保留空间,保存已经处理过的输入行,最多8192字节

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

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

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

(3)显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空

(4)重复上述过程,直到将文件中所有数据处理完毕

图:

注意:默认情况下所有的sed命令都是在模式空间内执行的,因此输入的文件并不会发生任何变化,除非是用重定向存储输出

1.2. 基本语法

1.2.1. 格式

sed -参数 '[定址符]' '操作' 文件名

1.2.2. 参数

-n,--quiet,--silent:安静模式,不输出模式空间中的内容,在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来

-i:直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作

-e:直接在命令行模式上进行sed的动作编辑,多个子命令之间也可以用分号隔开,如:sed -e 'command1;command2... filename 或者 sed -e 'command1' -e command2' ……filename

-r:使用扩展正则表达式

-f:直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作

--help:显示帮助

--version:显示版本

-{} :可组合多个命令,以分号隔开

1.2.3. 定址符

用于使用数字指定处理的行区间,或者使用正则进行过滤

表示方法

1.2.4. 操作

s:替换,替换指定字符,一般搭配正则表达式
d:删除,删除选定的行。
p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以
ASCII 码输出。其通常与“-n”选项一起使用。
=:打印行号。
a:增加,a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
i:插入,i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
c:行替换,指定行中的所有内容,替换成该选项后面的字符串。
y:字符转换,转换前后的字符长度必须相同。
l(小写):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
! :对指定行以外的所有行应用命令
& :代表匹配到的内容

1.3. 输出文本

1.3.1. 范例文件:

[root@server ~]# vim sed1.txt
one
two
three
four
five
six
seven
eight
nine
ten

1.3.2. 示例

[root@server ~]# sed -n 'p' sed1.txt # 全文打印[root@server ~]# sed -n '=;p' sed1.txt # 同时打印行号[root@server ~]# sed -n -e '=' -e 'p' sed1.txt # 同上[root@server ~]# sed -n 'l' sed1.txt # 同时输出内容及控制字符
[root@server ~]# sed -n ' # 交互模式
> =
> p
> ' sed1.txt[root@server ~]# sed -n '1p' sed1.txt # 打印第一行[root@server ~]# sed -n '4,6p' sed1.txt # 打印4-6行[root@server ~]# sed -n '3,9p' sed1.txt # 打印中3到9行内容[root@server ~]# sed -n '7,$p' sed1.txt # 第7行到最后一行[root@server ~]# sed -n '$p' sed1.txt # 打印最后一行[root@server ~]# sed -n '2~2p' sed1.txt # 打印偶数行[root@server ~]# sed -n '1~2p' sed1.txt # 打印奇数行[root@server ~]# sed -n '4p;6p;8p' sed1.txt # 打印第4、6、8行[root@server ~]# sed -n '1,+5p' sed1.txt # 打印第一行及其下5行[root@server ~]# sed -n '1!p' sed1.txt # 打印除了第一行的剩余行[root@server ~]# sed -n '/^f/p' sed1.txt # 正则检索以f开头[root@server ~]# sed -n '/t/p' sed1.txt # 正则检索包含t的行[root@server ~]# sed -n '/^t/p;/^f/p' sed1.txt # 正则检索以t开头或者f开头的行[root@server ~]# sed -n '2,/five/p' sed1.txt # 检索第2行到five所在行的内容[root@server ~]# sed -n '/n$/p' sed1.txt # 正则检索以n结尾的行[root@server ~]# sed -n 'n;p' sed1.txt # 检索偶数行[root@server ~]# sed -n 'p;n' sed1.txt # 检索奇数行[root@server ~]# sed -n '$=' sed1.txt # 打印文本行数

1.4. 文本替换

1.4.1. 范例文件

[root@server ~]# cp /etc/passwd ~/ps
[root@server ~]# cat ps
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
……
……

1.4.2. 格式:

sed -参数 '行范围s/旧字符串/新字符串/替换标记' 文件名

行范围:使用数字表示,即对第几行到第几行进行替换处理,若省略则表示进行全文处理

s: 替换动作

/// :表示替换格式

替换标记

(1)数字:使用1-512之间的数字,表示指定需要替换的字符串出现第几次才进行替换

(2)g:对数据中所有匹配到的内容进行替换,若省略g则只会对第一次匹配的内容进行替换

(3)p:替换成功立刻打印,一般与-n一起使用

(4)w 文件名 : 将缓冲区的内容写入到指定文件中

(5)& : 使用正则表达式匹配的内容进行替换

(6)\ :转义符,若有特殊符号或路径则需要转义

1.4.3. 示例

[root@server ~]# sed 's/root/boot/g' ps # 替换root为boot[root@server ~]# sed -n 's/root/admin/p' ps # 将每一行的第一个root替换为admin[root@server ~]# sed -n 's/root/admin/2p' ps # 将本行第2次出现的root进行替换[root@server ~]# sed -n 's/root/admin/gp' ps # 将文本中所有root全部替换[root@server ~]# sed -n '4s/adm/root/gp' ps # 将第4行内容替换# 将ps文件第4行的/sbin/nologin替换为/bin/bash,注意:路径的/必须要转义
[root@server ~]# sed -n '5s/\/sbin\/nologin/\/bin\/bash/p' ps[root@server ~]# sed 's#/sbin/nologin#/bin/bash#g' ps # 同上,/可写为#[root@server ~]# sed 's#root#boot#g' ps # 同上,但内容为#不能更改[root@server ~]# sed -n '$s/:/@/gp' ps # 最后一行冒号替换为@# 全文注释:即行首添加# ,#&表示在定位位置的左侧添加#
[root@server ~]# sed 's/^/#&/' ps[root@server ~]# sed 's/^/#/' ps 可省略&# 检索SSH行,在其单词左侧添加#,不能省略&,否则为替换
[root@server ~]# sed 's/SSH/#&/' ps[root@server ~]# sed 's/SSH/&#/' ps # 检索SSH行,&#表示在其单词右侧添加#[root@server ~]# sed 's/^/@&/g;s/$/&@/g' ps # 所有行首及行尾添加@,可省略&[root@server ~]# sed '1s/^/\n/' ps # 第一行之前插入空白行[root@server ~]# sed '$s/$/\n/' ps # 最后一行之后插入空白行# 所有小写改大写,\u表示大写,&启用正则匹配
[root@server ~]# sed 's/[a-z]/\u&/g' ps# 所有大写改小写,\l(注意是小写的L)表示小写,&启用正则匹配
[root@server ~]# sed 's/[A-Z]/\l&/g' ps# 单词第一个字母大写,\b表示匹配词首边界
[root@server ~]# sed 's/\b[a-z]/\u&/g' ps
# 开启selinux
[root@server ~]# sed -i '7s/disabled/enforcing/' /etc/selinux/config
# 将22行的disabled替换为enforcing
# 使用sed更换httpd的网页默认目录
[root@server ~]# yum install nginx -y
[root@server ~]# sed -i '42s/\/usr\/share\/nginx\/html/\/www\/zy/' /etc/nginx/nginx.conf
# 使用替换实现删除[root@server ~]# sed -n 's/root//gp' ps # 将全文中root替换为空,即删除[root@server ~]# sed -n 's/^.//p' ps # 删除每行第一个字符,^.表示行首任意一个字符[root@server ~]# sed -n 's/^#//p' /root/anaconda-ks.cfg # 将注释符#删除[root@server ~]# sed -n 's/.$//p' ps # 删除每行最后一个字符[root@server ~]# sed '5,10s/[0-9]//g' ps # 删除5-10行的所有数字# 删除所有的特殊字符(除了数字及大小写字母),将结果写入到t1.txt文件中
[root@server ~]# sed 's/[^(a-z)(A-Z)(0-9)]//gw t1.txt' ps

1.5. 删除文本

1.5.1. 注意

d操作用于删除文本的特定行,会删除指定的所有内容,则使用该命令必须特别小心,若忘记指定处理行的话会删除所有内容,也不会有任何输出

[root@server ~]# sed -i 'd' ps # 全部清空
[root@server ~]# cat ps

1.5.2. 示例

[root@server ~]# cp /root/anaconda-ks.cfg / # 示例文件准备
[root@server ~]# sed '1d' /anaconda-ks.cfg # 删除第1行[root@server ~]# sed '2,5d' /anaconda-ks.cfg # 删除2、5行[root@server ~]# sed '8,$d' /anaconda-ks.cfg # 删除第8到结尾所有行[root@server ~]# sed '$d' /anaconda-ks.cfg # 删除最后一行[root@server ~]# line_number=1
[root@server ~]# sed "${line_number}d" /anaconda-ks.cfg # 删除某行,使用变量作为行号[root@server ~]# sed '/^$/d' /anaconda-ks.cfg # 删除空白行[root@server ~]# sed '/System/d' /anaconda-ks.cfg # 将包含Options的整行删除[root@server ~]# sed -e '/System/d' -e '/Root/d' /anaconda-ks.cfg # 多个关键字[root@server ~]# sed '/System/d' sos.conf | sed '/Root/d' /anaconda-ks.cfg # 同上[root@server ~]# sed '/3/,/5/d' /anaconda-ks.cfg # 删除3所在行到5所在行之间的内容(包含)[root@server ~]# sed '/^#/d' /anaconda-ks.cfg
# 注意:默认情况下,删除的内容只是在输出的结果中消失了,没有增减-i参数时源文件不变

1.6. 插入文本

1.6.1. 注意

使用a(append)动作在指定行的下一行追加一行,使用i(insert)动作在指定行前插入一行,两者格式相同

1.6.2. 格式

sed '行范围a(或i)\新文本' 文件名

1.6.3. 示例1

[root@server ~]# cat /etc/hosts
[root@server ~]# cp /etc/hosts ~/# 尾部添加一行
[root@server ~]# sed -i '$a\192.168.48.132 www.openlab.com' ~/hosts# 某行之前添加
[root@server ~]# sed -i '3i\192.168.48.131 www.openlab.com' ~/hosts# 文本匹配后插入
[root@server ~]# sed -i '/131/i\192.168.48.130 www.openlab.com' ~/hosts

1.6.4. 注意

sed基于数据流处理的命令,若无内容则无法处理,所以空文件不能插入

[root@server ~]# touch t2.txt
[root@server ~]# cat t2.txt
[root@server ~]# sed -i '$a\xiao ming,18,98.5' t2.txt
[root@server ~]# cat t2.txt

1.7. 练习

习题1

示例:把/etc/passwd 复制到/root/test.txt,用sed打印所有行;
1、打印test.txt的3到10行;
2、打印test.txt 中包含’root’的行;
3、删除test.txt 的15行以及以后所有行;
4、删除test.txt中包含’bash’的行;
5、替换test.txt 中’root’为’toor’;
6、替换test.txt中’/sbin/nologin’为’/bin/login’
7、删除test.txt中5到10行中所有的数字;
8、删除test.txt 中所有特殊字符(除了数字以及大小写字母);
9、在test.txt 20行到末行最前面加’aaa:’
10、在test.txt所有行首增加#注释

1.

2.

3.

4.

5.

6.

7.

8.

9.

10.

习题2

# 打印4-8行
# 打印第3行及其下2行
# 打印中包含null的行
# 打印第5行到sshd所在行的内容
# 将全文的替换adm替换为admin
# 将全文的/bin/bash替换为/usr/bin/sh
# 将1-5行的单词第一个字母大写
# 在第5行之前插入一个空白行
# 安装bind,将/etc/named.conf的2项参数替换为any
# 删除所有的冒号
# 在最后一行之后添加一个空白行
# 删除root所在行
# 在第一行之前插入一条信息记录,内容自定

1.打印4-8行

2.打印第3行及其下2行

3.打印中包含null的行

4.打印第5行到sshd所在行的内容

5.将全文的替换adm替换为admin

6.将全文的/bin/bash替换为/usr/bin/sh

7.将1-5行的单词第一个字母大写

8.在第5行之前插入一个空白行

9.安装bind,将/etc/named.conf的2项参数替换为any

10.删除所有的冒号

11.在最后一行之后添加一个空白行

12.删除root所在行

13.在第一行之前插入一条信息记录,内容自定

习题3:

[root@server ~]# vim nowcoder.txt
zhangsan 30 18567198188
wangwu 20 13390789090
lisi 26 15129883716[root@server ~]# cat nowcoder.txt
zhangsan 30 18567198188
wangwu 20 13390789090
lisi 26 15129883716[root@server ~]# sed -r 's/([1-9]{3})([0-9]{4})([0-9]{4})$/\1-\2-\3/g' nowcoder.txt

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

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

相关文章

提升生产能力的必备工具——MES系统自动排产

在现代制造业中,生产能力的提升对企业发展至关重要。随着市场竞争的日益激烈,企业不仅需要提高产品质量,还需要提高生产效率。而MES系统自动排产作为一种先进的生产管理工具,可以帮助企业高效地安排生产,实现生产能力的…

江科大stm32学习笔记——【3-2】GPIO输出:LED闪烁LED流水灯蜂鸣器

(一) 硬件连接 1.LED闪烁 LED灯正极连接面包板电源正极,LED负极连接单片机A0口 (也可以LED负极连面包板负极,LED正极连接单片机A0口) 跳线连接单片机3.3和面包板正极,连接单片机GND和面包板负极 2.LED流水灯 3.蜂鸣…

你并不了解 JavaScript:入门 - 第二版 - 第二章:JS 概观

第二章:JS 概观 学习 JS 的最好方法就是开始写 JS。 要做到这一点,你需要知道这门语言是如何工作的,而这正是我们在这里要重点讨论的。即使你以前用过其他语言编程,也要慢慢适应 JS,并确保练习每一块。 这一章并不是…

自学黑客的这些坑千万别踩,不然就是在做无用功!

一、自学网络安全学习的误区和陷阱 1.不要试图先成为一名程序员(以编程为基础的学习)再开始学习 一般来说,学习编程不但学习周期长,而且实际向安全过渡后可用到的关键知识并不多 一般人如果想要把编程学好再开始学习网络安全往…

并发编程(3)JMM

5 共享模型之内存 本章内容 上一章讲解的 Monitor 主要关注的是访问共享变量时,保证临界区代码的原子性. 这一章我们进一步深入学习共享变量在多线程间的【可见性】问题与多条指令执行时的【有序性】问题 5.1 Java 内存模型 JMM 即 Java Memory Model&#xff…

SQL库操作

1、创建数据库 概念 创建数据库:根据项目需求创建一个存储数据的仓库 使用create database 数据库名字创建 数据库层面可以指定字符集:charset/character set 数据库层面可以指定校对集:collate 创建数据库会在磁盘指定存放处产生一个文件夹 创建语法 create …

六.生成makefile文件 并基于makefile文件编译opencv

1.点击【Generate】 生成makefile文件 2.进入目录下编译opencv源码,mingw32-make -j 8 3..编译出现报错 4.取消[WITH_OPENCL_D3D11_NV]选项,再次【configure】【generate】 然后再次编译:mingw32-make -j 8

【springblade】springblade(bladeX) 数据权限失效原因分析

文章目录 数据权限接口权限 前言:最近博主在按照bladeX官方文档 配置数据权限 结果发现失效了,网上搜了一下没找到合适的答案,本着求人不如求己的精神,自己调试了一下发现了问题所在,也大致看了一下bladeX的权限逻辑。…

这份攻略帮助你分分钟构建出“幻兽帕鲁游戏”极致体验【下】

在上一篇文章这份攻略帮助你分分钟构建出“幻兽帕鲁游戏”极致体验【上】中写了,极狐GitLab 将 terraform state 文件管理了起来。这篇文章将演示如何将所有的 terraform 文件存储到极狐GitLab 中,并且使用 CI/CD 自动实现 terraform 命令的执行。 在 D…

最简单方式把jar打包成Windows服务

废话 😢 将JAR文件转化为Windows服务是一种高效且常见的Java应用部署策略。这种转变赋予了Java应用程序在Windows操作系统上以无界面后台服务模式运行的能力,从而实现了持续、稳定且可靠的功能提供。这种部署方式不仅提升了应用的可用性&#xff0c…

re-迷宫题学习

re中的迷宫问题有以下特点: 在内存中布置一张 "地图"将用户输入限制在少数几个字符范围内.一般只有一个迷宫入口和一个迷宫出口 布置的地图可以由可显字符 (比如#和*)组合而成 (这非常明显, 查看字符串基本就知道这是个迷宫题了.), 也可以单纯用不可显的十六进制值进…

【鸿蒙 HarmonyOS 4.0】UIAbility、页面及组件的生命周期

一、背景 主要梳理下鸿蒙系统开发中常用的生命周期 二、UIAbility组件 UIAbility组件是一种包含UI界面的应用组件,主要用于和用户交互。 UIAbility组件是系统调度的基本单元,为应用提供绘制界面的窗口;一个UIAbility组件中可以通过多个页…

【大厂AI课学习笔记NO.50】2.3深度学习开发任务实例(3)任务背景与目标

我们经常在做项目的时候,觉得分析背景和目标是浪费时间,觉得不过如此。 其实目标梳理特别重要,直接决定你数据的需求分析,模型的选择,决定你交付的质量。 人工智能项目也和其他项目一样,不要想当然&#…

7-liunx服务器规范

目录 概况liunx日志liunx系统日志syslog函数openlog 可以改变syslog默认输出方式 ,进一步结构化 用户信息进程间的关系会话ps命令查看进程关系 系统资源限制改变工作目录和根目录服务器程序后台话 概况 liunx服务器上有很多细节需要注意 ,这些细节很重要…

Redis进阶篇

Redis线程模型 redis是基于内存运行的高性能k-v数据库,6.x之前是单线程, 对外提供的键值存储服务的主要流程 是单线程,也就是网络 IO 和数据读写是由单个线程来完成,6.x之后引入多线程而键值对读写命 令仍然是单线程处理的,所以 …

智能未来之路:《NIST AI RMF 1.0》与负责任的AI发展

引言 在当今快速发展的人工智能领域,美国国家标准与技术研究院(NIST)发布的《NIST AI RMF 1.0》框架是一个标志性的里程碑。这一框架不仅为AI技术的负责任和可信赖使用提供了重要指导,而且对于推动可持续的AI发展具有深远影响。本…

CrossOver虚拟机软件2024有哪些功能?最新版本支持哪些游戏?

CrossOver由codewaver公司开发的类虚拟机软件,目的是使linux和Mac OS X操作系统和window系统兼容。CrossOver不像Parallels或VMware的模拟器,而是实实在在Mac OS X系统上运行的一个软件。CrossOvers能够直接在Mac上运行Windows软件与游戏,而不…

创建型设计模式 - 原型设计模式 - JAVA

原型设计模式 一 .简介二. 案例三. 补充知识 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 一 .简介 原型模式提供了一种机制,可以将原始对象复制到新对象&#xff0…

一文读懂什么是 IP 欺骗

IP欺骗被认为是最容易发起且最具破坏性的攻击之一。这种攻击方式通过伪造源IP地址来隐藏攻击者的真实身份,从而可以逃避追踪和封锁。由于IP欺骗的隐蔽性和难以追踪性,它经常被用于发起各种恶意攻击,如DDoS攻击、网络钓鱼和诈骗、内部网络攻击…

DM数据库学习之路(十八)DMHS数据实时同步软件部署及迁移测试

​​​​​ DMDRS介绍 产品介绍 达梦数据实时同步软件(以下简称 DMDRS)是支持异构环境的高性能、高可靠、高可扩展数据库实时同步复制系统。该产品采用基于日志的结构化数据复制技术,不依赖主机上源数据库的触发器或者规则,对主…