day29linux三剑客----sed

news/2025/3/14 19:41:23/文章来源:https://www.cnblogs.com/yangzaikai/p/18772759

day29linux三剑客----sed

  • 单个正则字符还认识

  • 组合到一起就晕了,怎么办?

    • 本质还是对单个字符没理解
.认识*认识.*组合到就一起就蒙了,为什么?还是没想明白.的意义,*的意义正则表达式,从左向右,逐步理解单个字符的意义怎么做?
1.思维脑图写没写?
2.每一个正则表达式的符号,自己有没有动手再敲几遍?
需要提取的数据,有了一定的理解,(脑海中转变为,是否能通过正则的符号,去替代,匹配这些数据)
3.练习题是否不看答案,自己是否能写出正则表达式?以及琢磨出一个新答案?最后
1.正则表达式这个东西,的确是需要孰能生巧,慢慢来,语法记住了,就慢慢练就好,这玩意是和写代码是一个意思,逻辑性很重

关于linux三剑客

  • grep,过滤关键字信息数据。主要是用于查文本内的数据
  • sed ,对文本数据进行编辑,修改原文件内容
  • awk,对文件数据过滤,提取,并且能实现,格式化输出
    • awk对文件数据处理后,还能更美观的展示数据

sed是什么

  • sed软件本身
  • sed提供的加工的命令
  • 给sed提供的源数据

sed 的语法

sed [选项] [sed内置命令字符] [输入文件]说明:
1.注意 sed 软件及后面选项,sed 命令和输入文件,每个元素之间都至少有一个空格2.为了避免混淆,文本称呼sed为sed软件.sed-commands(sed命令)是sed软件内置的一些命令选项,为了和前面的 options(选项)区分,故称为sed命令.3.sed-commands 既可以是单个sed 命令,也可以是多个sed命令组合.4.input-file(输入文件)是可选项,sed 还能够从标准输入或管道获取输入
语法:
sed 替换字符的数据
s 替换字符的指令
#替换之前的数据(正则)#替换后的数据#sed 's#替换之前的数据# 替换后的数据#' file.txt

sed参数

sed 默认修改的是模式空间内的数据
(简单大白话,sed读取了一行文本数据,放入到内存里进行修改,修改的结果默认不会写入到文件中,只是在内存里修改,且打印让你看到修改的结果)
吧修改的结果写入到文件就得用参数
-i 把sed 处理的结果,写入到文件,且不在终端打印
sed -i 's#替换之前的数据#替换后的数据#' file.txt
options[选项]
解释说明
-p		p 打印模式空间的内容,通常 p 会与选项-n 一起使用
-n    取消默认的 sed 软件的输出,常与 sed 命令的 p 连用
-e    一行命令语句可以执行多条 sed 命令
-f    选项后面可以接 sed 脚本的文件名
-r    使用正则拓展表达式,默认情况 sed 只识别基本正则表达式
-i    直接修改文件内容,而不是输出终端,如果不使用-i 选项 sed 软件只是修改在 内存中的数据,并不影响磁盘上的文件

sed软件的实践

练习的文章My name is yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn

Sed 默认不修改源文件

sed默认的命令操作,不会修改源文件,你看到的终端结果,只是sed把模式空间的内容打印给你看了而已。

得用sed -i 参数修改源数据。

sed工作图流程

任务是:把yuchao 改为吴彦祖


sed的修改字符与默认的取消输出

也就是说   -n 和 p 要同时的出现  

sed增删改查(练习)

在练习期间,别用-i参数,去修改源文件,直接看替换结果

理解sed的语法

增,表示在指定行与行之间,添加新字符数据

我们也可以用vi、vim去在某一行,增加数据,但是这种交互式操作,没法进行脚本化
因此sed来了!

sed增加字符命令

"a":追加文本到指定行,记忆方法:a 的全拼是 apend,,意思是追加3a 表示在第三行下面追加数据"i":插入文本到指定行前,记忆方法:i 的全拼是 insert,意思是插入3i 在第三行上面插入数据

即a是向下追加

i是向上追加

单行增加命令

语法

sed '行号 sed指令   你想添加的字符数据' 源文件

sed增加数据的命令

a 追加,在指定行后添加一行或多行文本i 插入,在指定的行前添加一行或多行文本

实践

在文件第二行后,插入数据,"今天又是美好的一天"

在第二行插入数据

cat 实现多行文本的追加

cat >> my.log << EOF

echo追加命令

1.多次追加
echo "你好" >> tt.log2.使用换行符,一次添加多行数据echo 'hello\nworld\n你好\n我也好' > hello.loghello
world
你好
我也好

sed 追加多行的文本

无论是cat、还是echo,都只能往文件末尾追加内容。

而sed是按行处理文本,可以指定要处理的行,也就是在指定行插入字符数据。

使用\n添加多行数据

给t1.log 开头,添加两行数据
加油
奥力给[root@linux-yzk ~]# sed '1 i 加油\n奥里给' t1.log 
加油
奥里给
My name is yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn
[root@linux-yzk ~]# 

练习sed追加配置文件信息(单行)

1.练习,修改nginx配置文件,在第39行插入新数据 listen 81;sed '39 a linsten 81;' /etc/nginx/nginx.conf

修改sshd_config实战

[242-yuchao-class01 root ~]## 远程连接服务 sshd 
[242-yuchao-class01 root ~]#ls /etc/ssh/sshd_config

例如我们在系统初始化优化时,需要修改sshd服务端设置,需要加入如下多行配置

Port 25515                                   # 改端口
PermitRootLogin no                   # 不允许root登录
PerminEmptyPasswords no         # 不允许空密码
UseDNS no                                    # 不做主机名解析,加速ssh连接
GSSAPIAuthentication no            # 不做主机名解析,加速ssh连接

在开头加入这些配置

sed -i '1 i Port 25515\nPermitRootLogin no\nPerminEmptyPasswords no\nUseDNS no\nGSSAPIAuthentication no'   /etc/ssh/sshd_config

最后总结

sed和vim的一些指令有共性vim  插入模式aio sed数据插入命令a 在指定的行下面插入i 在指定行上面插入数据

sed删除字符数据

我们以前是用vim编辑文本,也是通过d命令,剪切(删除)数据。

sed关于删除的命令

d 删除指定的行
d 命令,表示删除字符,delete意思sed默认是多行处理所有文本,如果不指定范围,sed默认是删除所有文本行数据了

sed删除所有数据

# 删除第二行的数据[root@linux-yzk ~]# sed '2 d' t1.log 
My name is yuchao.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn
[root@linux-yzk ~]# 

sed删除1到4行---可以用;分号

sed '1,4d' t1.log

sed命令语法(记忆)

sed软件提供的命令很强大,刚开始到不用全部记住,以后逐步记忆即可,记住最常用的。

关于sed处理文件行范围语法

关于sed处理文件行范围语法

sed命令语法 作用
3 操作第三行
3,6 操作3~6行,包括3和6行
3,+5 操作3到3+5(8)行,包括3,8行
1~2 步长为2,操作1,3,5,7..行
3,$ 对3到末尾行操作,包括3行
/yuchao/ 对匹配字符yuchao的该行操作
/yuchao/,/chaoge/ 对匹配字符yuchao到chaoge的行操作
/yuchao/,$ 对匹配字符yuchao到结尾的行操作
/yuchao/,+2 '/yuchao/,+2p',打印匹配到yuchao的行,包括其后2行
删除第三行数据
sed '3 d'  t1.log
删除文件的3到6行
sed '3,6 d' t1.log删除第三行开始,向下2行
sed '3,+2 d'  t1.log删除奇数行 1,3,5,7,9sed '1~2 d' t1.log删除偶数行 2,4,6,8
sed '2~2 d' t1.log保留前三行
[242-yuchao-class01 root ~]#sed -e  '4,$  d'  t1.log 
加油
奥力给
My name is yuchao.找到game那一行,且删掉
[242-yuchao-class01 root ~]#sed '/game/ d' t1.log
加油
奥力给
My name is yuchao.
I teach linux.
My qq is 877348180.
My website is http://www.yuchaoit.cn删除game这一行到结尾
[242-yuchao-class01 root ~]#sed '/game/,$ d'  t1.log 
加油
奥力给
My name is yuchao.
I teach linux.删除文件中所有包含game的行,以及它下一行
[242-yuchao-class01 root ~]#sed '/game/,+1 d' t1.log 
加油
奥力给
My name is yuchao.
I teach linux.
My website is http://www.yuchaoit.cn

打印范围的练习

  • sed 提供的打印的命令是p

打印game那一行,以及后面的一行[root@linux-yzk ~]# sed '/game/,+1 p ' t1.log 
My name is yuchao.
I teach linux.
I like play computer game.
I like play computer game.
My qq is 877348180.
My qq is 877348180.
My website is http://www.yuchaoit.cn[root@linux-yzk ~]# sed '/game/,+1 p ' t1.log -n
I like play computer game.
My qq is 877348180.
[root@linux-yzk ~]# 

sed 的删除练习

源数据:
My name is yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn

删除game和http的行

也就是删除了2个指定的行

sed '/game/d;/http/d'  t1.log

删除My开头的行

sed '/^My/d' t1.log

sed忽略大小写的指令

sed提供了 大写的I 指令
用于忽略大小写
[242-yuchao-class01 root ~]#sed '/^My/d' t1.log
加油
we all like games
奥力给
I teach linux.
I like play computer game.my 大脑 已经 停机了
[242-yuchao-class01 root ~]#sed '/^My/Id' t1.log
加油
we all like games
奥力给
I teach linux.
I like play computer game.

删除以.结尾的行

sed '/\.$/d'  t1.log

删除第二行到qq的行

sed '2,7d' t1.logsed '2,/qq/d' t1.log

删除2和5两行

sed '2d;5d' t1.log

删除2到5行

sed '2,5d' t1.log

删除3到尾行

sed '3,$d' t1.log

删除偶数行(步长)

[242-yuchao-class01 root ~]#seq 1 10 | sed '2~2d' 
1
3
5
7
9

删除奇数行(步长)

[242-yuchao-class01 root ~]#seq 1 10 | sed '1~2 d'
2
4
6
8
10

感叹号取反

感叹号在很多命令里都是取反的作用,sed也一样,但是是和sed命令结合用,如!d

Id sed的忽略大小写命令!d 结果取反
  • [^abc]
    取除了abc的其他字符
  • 直接对动作命令取反

除了有字符yuchao的行,其他都删除

[242-yuchao-class01 root ~]#sed '/yuchao/!d' t1.log 
My name is yuchao.
My website is http://www.yuchaoit.cn
[242-yuchao-class01 root ~]#

删掉除了My开头的行

sed '/^My/!d'  t1.log

总结

工作里用的最多的还是指定数字行号,或者完整字符精确匹配,不容易出错。

而正则或是其他模糊匹配,很容易改错,了解即可。




加油!!!!!!! 2025-3-14下午



sed修改数据

修改数据,是一大重点,因为我们需要用sed来修改各种配置文件,sed这种非交互式修改文件内容,在脚本中实现自动化修改是最常见的。

如修改nginx的端口;

修改mysql的数据存储路径;

替换整行命令(c)

c    把选定的行改为新的文本。把11行替换为新数据 ,  睡醒了 精神很饱满
语法
sed ' 11 c   睡醒了,精神很饱满  ' t1.log

替换文件的第二行,改为 "I love linux , python !"

整行全部替换
sed '2c  I love linux , python !' t1.log

替换字符(s命令)

语法

这个功能占用了sed使用率的80%,基本替换的功能都是这个s指令。

sed替换的命令解释
这个分隔符,常见有如下形式
sed 's/old_string/new_string/'
sed 's#old_string#new_string#'
sed 's@old_string@new_string@'强烈建议用# 
sed 's#old_string#new_string#'替换一次
sed 's/替换前字符/替换后字符/' file全局替换,global 全局替换
sed 's/替换前字符/替换后字符/g' files 将每一行第一处匹配的字符替换 
s/old_string/new_string/sed 's#i#I#'  t1.logg 全局替换global,每一行,每一处匹配的字符都替换  s/old_string/new_string/sed 's#i#I#g'  t1.logsed 's/i/I/g'  t1.log-i 选项、参数,直接修改文件sed默认是修改内存中的模式空间数据,不会修改源文件,使用-i会修改源文件,修改磁盘上的文件数据。

测试数据

My name is yuchao. you can call me yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/

字符yuchao改为老于

替换一次

[242-yuchao-class01 root ~]#sed 's#yuchao#老于#' t1.log 
My name is 老于. you can call me yuchao.
I teach linux.
I like play computer game.
My qq is 877348180.
My website is http://www.老于it.cn , and another website is https://www.yuchao.top/

替换多次,全局替换

sed 's#yuchao#老于#g' t1.log 

替换第三行的computer改为linux

sed '3 s#computer#linux#g' t1.log

所有的My改为His

指定my开头

注意,sed提供了忽略大小写的命令,大写的 I
注意大小写不加忽略大小写命令的写法
sed 's#^My#His#'  t1.log添加忽略大小写的命令
sed 's#my#His#Ig'  t1.log

sed使用shell变量

sed要替换数据,替换的内容是从shell变量里拿到的new_name="彭于晏"注意单引号、双引号的对变量的解析作用
[242-yuchao-class01 root ~]#sed "s#yuchao#$new_name#g"  t1.log
My name is 彭于晏. you can call me 彭于晏.
I teach linux.
I like play computer game.
My qq is 877348180. my num is 1555555555.
My website is http://www.彭于晏it.cn , and another website is https://www.彭于晏.top/

sed分组替换

注意别忘了扩展正则 -r参数

语法:
sed软件也提供了 \(\)分组功能
使用\1引用第一个括号的数据
\2引用第二个括号的数据
sed最多记住9个分组() \1向后引用分组数据

测试数据

echo 'I am teacher yuchao,welcome my linux course' | sed -r '^.*,(.*)\s+m.*'

提取出welcome这个单词

[242-yuchao-class01 root ~]#echo 'I am teacher yuchao,welcome my linux course' | sed -r 's/^.*,(.*)m.*/\1/g'
welcome 

分组取出ip

\s 表示单个空格

去头去尾法
[242-yuchao-class01 root ~]#ifconfig ens33 | sed -e '2s/^.*inet//' -e '2s/netmask.*//p' -n 192.168.0.242  分组提取法
参数作用sed命令时的作用

sed查询

sed的修改,删除最重要的学完了

接下来看看sed的查询,也是比较实用的,比起cat、more要方便的多。

sed打印命令p 打印sed正则处理后的数据并且sed默认打印模式空间,可以用-n取消文本,10数据  > sed 一行一行的读取,编辑 >> 打印固定用法,只要使用到了p打印些数据,就是想输出指定数据
必然用-n取消默认打印,目的是,只看到你想p打印的那些数据

打印第二行

sed '2 p ' t1.log

打印前三行

[242-yuchao-class01 root ~]#sed '1,3p' t1.log -n
My name is yuchao. you can call me yuchao.
I teach linux.
I like play computer game.

只显示qq号那一行

[242-yuchao-class01 root ~]#sed -r '/[0-9]{9}/p' t1.log -n
My qq is 877348180. my num is 1555555555.

找出http和linux的行

-e 多次编辑
[242-yuchao-class01 root ~]#sed -e '/http/p'  -e '/linux/p' t1.log -n
I teach linux.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/[242-yuchao-class01 root ~]#sed '/http/p;/linux/p' -n t1.log 
I teach linux.
My website is http://www.yuchaoit.cn , and another website is https://www.yuchao.top/

sed其他命令

w命令

作用是将sed操作结果,写入到指定文件中

语法sed '/模式/w new_file' old_file必须,找出computer这一行,数据写入到game2.log文件中
[242-yuchao-class01 root ~]#sed '/computer/w  game2.log' t1.log  -n
[242-yuchao-class01 root ~]#
[242-yuchao-class01 root ~]#
[242-yuchao-class01 root ~]#cat game2.log 
I like play computer game.

替换文件中所有的yuchao为老于,新数据写入 yu.log

[242-yuchao-class01 root ~]#sed 's#yuchao#老于#gw yu.log' t1.log -n

-e选项

-e选项用于接上sed多个命令

sed提取ip地址


提取1,2,4行信息

语法
sed -e 'sed命令' -e 'sed命令'  -e 'sed命令'sed -e '1p' -e '2p'  -e '4p' t1.log -n 换成分号

; 分号

分号也用于执行多条命令,和linux基础命令一样支持这种写法。

单独提取出1,2,4行信息

sed '1p;2p;4p'  t1.log -n
[242-yuchao-class01 root ~]#sed -e '1p' -e '2p'  -e '4p' t1.log -n 
My name is yuchao. you can call me yuchao.
I teach linux.
My qq is 877348180. my num is 1555555555.
[242-yuchao-class01 root ~]#
[242-yuchao-class01 root ~]#
[242-yuchao-class01 root ~]#sed '1p;2p;4p'  t1.log -n
My name is yuchao. you can call me yuchao.
I teach linux.
My qq is 877348180. my num is 1555555555.

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

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

相关文章

3.14 学习记录

基于Android Studio 完成了简单的石家庄地铁购票APP

Android配置

将grade-wrapper.properties中地址改为 https://mirrors.cloud.tencent.com/gradle/gradle-8.11.1-bin.zip 等待下载。一般要几个小时。

sqlserver 的视图创建

首先,什么是视图?视图是一种数据库对象,是从一个或者多个数据表或视图中导出的虚表,视图的结构和数据是对数据表进行查询的结果,只存放视图的定义,不存放视图对应的数据; 其结构和和数据是建立在对表的查询基础上,故表中的数据发生变化,从视图中查询出的数据也随之改变…

day:21 python——判断语句

一.if语句 (1)单分支: 格式: if 判断条件: 执行语句块 else: 执行语句块2 备注:判断条件 if中可以使用比较运算符,<,!=,==,>=,<=在学习自动化中也可以用if语句断言, 案例1: a=10 if a != 10: print("你中奖了") else: print("谢谢惠顾"…

clickhouse 开启认证

配置文件说明 默认路径:/etc/clickhouse-server/users.xml 密码存储类型 明文密码(不推荐) <password>qwerty</password> <!-- 直接明文存储 --> SHA256 哈希 <password_sha256_hex>5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d15…

二分查找--java进阶day06

1.二分查找 https://kdocs.cn/l/ciMkwngvaWfz?linkname=150996908 二分查找:每一次查找都从中间的元素查起,根据比较的大小来折半,以此类推,直到最后找到该数2.二分查找的前提 确保查找的数组是排好序的数组,否则就会出错 如下图,假设我们要找的是200,箭头指向88,发现…

Fastjson 和Jackson 兼容性问题

起因是因为java类里面多层嵌套验证发现APIFOX调用接口验证无法生效 发现是因为没有赋值嵌套类 经过查看属性填充的源码,requestbody传参,用的是Fastjson的注解但是走到了AbstractJackson2HttpMessageConverter类的readJavaType方法 一查发现可能有不兼容的问题,Jackson 需要…

modelsim保存波形图为图片报错:image file format bmp is unknown

在波形窗口依次点击 File-->Export-->Image 如果版本低于2020.2,会报错:解决方案为: 在命令框输入:package require Img 解决方案来自Why cant I export the wave image in bmp format in the ModelSim-Intel FPGA Edition and Questa-Intel FPGA Edition simulator?…

第十二课(2024年)基准测试与评估

来看一下讲师认为的理想的开发过程Deploy的Absolute的意思:部署阶段的评测指标是绝对的,之前的阶段都是从若干个模型中选择最好的,但最后一个阶段就只剩下一个模型了,我们必须要让这个模型的准确率达到一个设定的绝对阈值 Publish的Standardized和Reproducible:标准化和可…

【向量模型】 开源通用向量模型BGE (BAAI General Embedding)

BGE(BAAI General Embedding)是北京智源人工智能研究院(BAAI)推出的开源文本向量模型, 专门用于将文本转换为高维向量表示(即 Embedding),其核心目标是提升文本检索、语义匹配等任务的性能。1. BGE 的核心特点 总结 BGE 是专为检索任务优化的开源 Embedding 模型,优…

根据前序遍历和后序遍历计数二叉树

我们知道,对于一个二叉树,如果我们我们知道他的前(或后)序遍历和中序遍历,那就可以直接构造还原出完整的二叉树。中序遍历很重要。 那么给定一个树的前序遍历和后序遍历,能不能构造出这个树呢?一般是不行的,参考往期文章 https://www.cnblogs.com/ofnoname/p/16864200.…

使用Micrometer与prometheus集成监控jvm

1.简介Micrometer 是一个用于收集和报告指标的 Java 库,广泛用于 Spring Boot 和其他 Java 应用。它提供了对系统各项资源的监控支持,包括但不限于 JVM、内存、垃圾回收、线程池、HTTP 请求 等。Micrometer 支持与多种监控系统的集成,例如 Prometheus、InfluxDB、Datadog 等…