当前位置: 首页 > news >正文

sed利用脚本处理文件

一、sed是什么

sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编 辑一个或多个文件、简化对文件的反复操作、编写转换程序等。

二、sed的原理

读入新的一行内容到缓存空间;

从指定的操作指令中取出第一条指令,判断是否匹配pattern;

如果不匹配,则忽略后续的编辑命令,回到第2步继续取出下一条指令;

如果匹配,则针对缓存的行执行后续的编辑命令;

完成后,回到第2步继续取出下一条指令;

当所有指令都应用之后,输出缓存行的内容;回到第1步继续读入下一行内容;

当所有行都处理完之后,结束;

三、sed的常用操作选项

sed [选项] '操作' 参数

sed [选项] -f scriptfile 参数

常见的 sed 命令选项主要包含以下几种。

-e 或--expression=:表示用指定命令或者脚本来处理输入的文本文件。同时编辑

-f 或--file=:表示用指定的脚本文件来处理输入的文本文件

-h 或--help:显示帮助。

-n、--quiet 或 silent:表示仅显示处理后的结果。关闭打印

-i.bak:直接编辑文本文件。

-r, -E 使用扩展正则表达式

-s  将多个文件视为独立文件,而不是单个连续的长文件流

“操作”用于指定对文件操作的动作行为,也就是 sed 的命令。通常情况下是采用的“[n1[,n2]]”操作参数的格式。n1、n2 是可选的,代表选择进行操作的行数,如操作需要在 5~ 20 行之间进行,则表示为“5, 20 动作行为”。常见的操作包括以下几种。

a:增加,在当前行下面增加一行指定内容

c:替换,将选定行替换为指定内容

d:删除,删除选定的行

i:插入,在选定行上面插入一行指定内容

p:打印,如果同时指定行,表示打印指定行;如果不指定行,则表示打印所有内容;如果有非打印字符,则以 ASCII 码输出。其通常与“-n”选项一起使用。

s:替换,替换指定字符

y:字符转换。

简单版

选项 含义

-e    进行多次编辑

-n    取消默认输出

-f    指定sed文件名

-i    直接在源文件中修改

-r   使用扩展正则表达式

sed常用命令动作

命令动作 含义

p  打印输出

d  删除指定行

 在指定行之前插入内容

 在指定行后面插入内容

c   替换指定行所有内容

s     搜索替换

四、如何使用sed

sed [options] script filename

sed [option]...

'script;script;...'

[input  file...]

选项

自身脚本语法

 支持标准输入管道

options指的是sed的命令行参数,比较有限,这个后面会说明。

script是指需要对输入执行的一个或者多个操作指令, 一般需要用单引号括起来,这样可以避免shell   特殊字符的处理。 sed会依次读取输入文件的每一行到缓存中并应用script中指定的操作指令,因此而带 来的变化并不会影响最初的文件(除非option加了-i参数)。

每条操作指令由patternprocedure两部分组成,顾名思义, pattern是匹配的规则, 一般为用’/'分隔的 正则表达式(也有可能是行号,具体参见Sed命令地址匹配问题总结),procedure则是一连串编辑命 (action)

总结: sed命令+选项 定位+动作+内容文件名

五、具体操作

1、打印输出

[root@localhost ~]# cat -n /etc/passwd > /tmp/passwd           #-n 在行前面标序号 

[root@localhost ~]# sed '' /tmp/passwd                           #查看文件内容

1  root:x:0:0:root:/root:/bin/bash

2  bin:x:1:1:bin:/bin:/sbin/nologin

3  daemon:x:2:2:daemon:/sbin:/sbin/nologin

[root@localhost ~]# sed 'p' /tmp/passwd

#带有自动打印功能,p又再打印一遍

[root@localhost ~]# sed -n 'p' /tmp/passwd

-n 选项关闭自动打印功能  , p 打印

1.1 显示范围 行号(=)

[root@localhost ~]# sed  -n  '1p'  passwd1              # 直接显示第1

[root@localhost ~]# sed -n '1,3p' /tmp/passwd            #显示1~3行范围    

[root@localhost ~]# sed -n '1p;3p;5p' /tmp/passwd            # 显示第1,3,5 

[root@localhost ~]# sed -n '3,+3p' /tmp/passwd             #从第3行 往后加3

1.2 奇数偶数表示

[root@localhost ~]# sed -n '1~2p' /tmp/passwd                #奇数

#1从第一行开始,2选择每隔两行的行,p打印

[root@localhost ~]# sed -n '2~2p' /tmp/passwd           #偶数

#从第二行开始,2选择每隔两行的行,p打印出来

[root@localhost ~]# sed -n '2~3p' /tmp/passwd

#从第二行开始,3选择每隔三行的行,p并打印出来

[root@localhost ~]# sed -n '$p' /tmp/passwd              #最后一行

[root@localhost ~]# sed -n '/root/p' /tmp/passwd

#将包含root的行打印出来   /root(需要匹配的内容)/p(打印)  文件名     /  / 是包含的意思

#与 grep root /etc/passwd 功能相同

[root@localhost ~]# sed -n '/bash$/p' /tmp/passwd           #bash结尾 打印出来 文件名

[root@localhost ~]# sed -n '/s...x/p' /tmp/passwd

#/s...x/ 匹配包含一个字母 s,后面跟着任意三个字符,最后是一个字母 x 的行    p打印

[root@localhost ~]# sed -n '/[0-9]/p' /etc/passwd

#/[0-9]/ 匹配包含至少一个数字的行

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

#包含以root开头的行

[root@localhost ~]# sed -n '1!p' /tmp/passwd

#1!p 的意思是除了第一行之外的所有行都会被打印出来

[root@localhost ~]# sed -n '/nologin/!p' /tmp/passwd

#除了nologin都能打印出来

[root@localhost ~]# sed -n '/root/='  passwd

#找到所有包含字符串 "root" 的行;对于每一行,输出它在文件中的行号。

[root@localhost ~]# sed -n '/root/=;/root/p'  /tmp/passwd    

//多个模式匹配用分号或者-e

输出包含root行的行号  ; 打印包含root的行

[root@localhost ~]# sed -n '$=' zz.txt

# 输出最后一行行号    ,相当于统计文件有几行

[root@localhost ~]# sed -n '$=;1p' zzz.txt

#可以验证是逐行匹配

sed默认不支持扩展正则,如果要支持,需要加-r选项

[root@localhost ~]# sed -nr '/^root|^shutdown/p' /etc/passwd

打印  以root开头  或  以shutdown开头

可结合管道

[root@localhost ~]# df -h | sed -n '2p'

注意:通常-n‘p’一起使用

2、增加(i、a)

注意: a或者i后面的所有内容都会被理解为需要添加的内容

[root@localhost ~]# sed '2ihello world' /tmp/passwd

#2:在第2行   , i: 在指定的行之前插入文本hello world

[root@localhost ~]# sed '3ihello\nworld' /tmp/passwd

在第三行前打印hello world        \n 换行

[root@localhost ~]# sed '1ahello world' passwd1

# 在当第一行下面增加一行

[root@localhost ~]# sed '$ahello world' /tmp/passwd

在最后一行下面添加hello world

   

[root@localhost ~]# sed '2,4a hello' /tmp/passwd

#在2~4行下面添加hello

[root@localhost ~]# sed '/shengjie/a hello world' /tmp/passwd

在包含root的行下面添加hello

注意: a或者i后面的所有内容都会被理解为需要添加的内容

[root@localhost ~]# sed '/shengjie/a hello world;3p;3i shell' /tmp/passwd

在包含root的行下面添加   hello world;3p;3i shell

3、删除(d)

[root@localhost ~]# sed 'd' passwd

删除passwd里的所有内容

[root@localhost ~]# sed '1d' /tmp/passwd

删除第1行

[root@localhost ~]# sed '1,4d' /tmp/passwd

删除1到4行

[root@localhost ~]# sed '/nologin/d' /tmp/passwd

删除包含nologin的行

[root@localhost ~]# echo '' >> /tmp/passwd         在最后一行行尾添加空格    

[root@localhost ~]# echo '###' >> /tmp/passwd       在最后一行行尾添加###

[root@localhost ~]# sed '/^#/d' /tmp/passwd             删除以#开头的行

[root@localhost ~]# sed '/^#/d;/^$/d' /tmp/passwd       删除以#开头的行 ;空行

4、整行替换(c)

s/pattern/string/修饰符 查找替换 ,支持使用其它分隔符,可以是其它形式:s@@@s### 替换修饰符:

g 行内全局替换

p 显示替换成功的行

w   /PATH/FILE 将替换成功的行保存至文件中 

I,i   忽略大小写

[root@localhost ~]# sed '/^root/ckgc' /etc/passwd

以root开头的整行替换成kgc

[root@localhost ~]# sed '/root/ckgc' /etc/passwd

包含root的整行替换成kgc

[root@localhost ~]# sed 'ckgc' /etc/passwd

所有行替换成kgc

这里没有真的改变文件内容,只是输出到屏幕,如果想要真的替换,需要用-i选项,建议用-i之前对原文件进行备份            -i是真的修改

[root@localhost ~]# sed -n -i.bak 'p' /etc/hosts

给passwd 备份 passwd.bak         passwd.bak内容和passwd一样

5、搜索替换(s)

c指令使得整行内容全部替换, d指令删除整行,

s 只替换某个关键词

格式: sed 选项 ‘s/搜索的内容/替换的内容/动作 

[root@localhost ~]# sed 's/root/ROOT/' /tmp/passwd

搜索root所在行把第一个出现的root换成ROOT

[root@localhost ~]# sed -n 's/root/ROOT/gp' /tmp/passwd

搜索root所在行,把所有出现的root都替换成ROOT                 g:全局

不加-n p 打印全部 

加-n p 只打印有root行

[root@localhost ~]# sed -n 's/o/O/2p' /tmp/passwd

搜索字母o ,仅替换每行第二个o为大写O

[root@localhost ~]# sed -n 's/root//gp' /tmp/passwd

将全局所有root替换为空

[root@localhost ~]# sed  -n '1,5s/^/#/' /tmp/passwd

1-5行的开头都插入#

[root@localhost ~]# sed -n 's/\/sbin\/nologin/kgc/gp' /tmp/passwd

把所有/sbin/nologin换成kgc /需要转义  , \/sbin\/nologin

但是使用默认的转义符之后阅读体验非常差,而且还容易写错,我们可以指定更有辨识度的转义符,例 @,#,数字都可以,将原来的/替换成我们想要的

[root@localhost ~]# sed -n 's@/sbin/nologin@kgc@gp' /tmp/passwd

把所有 / 替换成 @ 或 #                   /sbin/nologin的 /  不换

我们只想搜索以root开头的行并且前面加#号,那就需要保留root,那就要把搜索的字符写成&就会被保留不会一起替换,观察不加&的区别

[root@localhost ~]# sed -n 's/^root/#&/gp' /etc/passwd

以 root 开头的行在行首加 # 并且保留 root

忽略大小写的替换

[root@localhost ~]# sed -n 's/network/ooooo/igp' /tmp/passwd

把所有无论大小写的 network 替换成 ooooo

生产案列

sed -i.bak 's/SELINUX=enable/SELINUX=disabled/' /etc/selinux/config

把 /etc/selinux/config 生成备份文件 config.bak

并把 SELINUX=enable 替换成SELINUX=disabled

6、插入文件(r)

我们还可以将其他文件插入到当前文件当中处理 

[root@localhost ~]# sed '3r /etc/hosts' passwd1

将/etc/hosts文件插入到 passwd1 第三行后面

[root@localhost ~]# sed '/2/r /etc/hosts' passwd1

将 /etc/hosts 文件插入到passwd1 含2的行下面

[root@localhost ~]# sed '$r /etc/hosts' passwd1

把 /etc/hosts 插入到passwd1最后一行下面

7、另存为到文件(w)

使用w指令将当前编辑的文件内容另存到其他文件中,如果目标文件已存在,则会将目标文件的内容覆

[root@localhost ~]# sed 'w passwd' /etc/hosts          #把 /etc/hosts 复制到 passwd

如果passwd 有内容, 则覆盖 

如果没有文件,则创建文件并复制

文件passwd1 已存在 ,把 /etc/hosts 复制到 passwd1 下,并覆盖

若没有文件 hosts ,创建文件hosts,并把 /etc/hosts 复制到 hosts 下

如果 hosts 文件不存在,sed 命令会创建它;如果存在,sed 将会覆盖该文件的内容。

如果你想将 /etc/hosts 文件的内容追加到 hosts 文件末尾,可以使用 >> 符号来实现,如

 sed 'w /tmp/hosts' /etc/hosts >> /tmp/hosts

把 /etc/hosts 复制到 hosts文件下,并追加到 hosts ,不覆盖

[root@localhost ~]# sed '1w hosts' /etc/hosts

# /etc/hosts 中的第一行另存为到 hosts 

8、同时编辑(-e)

sed支持一个或多个-e参数

[root@localhost ~]# sed -n -e '1p' -e '3p' /tmp/passwd 

            [root@localhost ~]# sed -ne '1p' -ne '5p' /etc/passwd 

表示用指定命令或者脚本来处理打印第一行和第三行

9、分组操作 {}

当我们需要对一行数据进行多次操作的时候我们可以使用{}进行分组

[root@localhost ~]# sed '/root/{s/root/ROOT/;s/x/X/g}' passwd1

把包含 root 的行 ,root替换成 ROOT ,本行所有 x 替换成 X     (g 全局)

[root@localhost ~]# sed -ne '/root/{s/root/ROOT/;s/x/X/g}' -ne '1,10p' passwd1

-ne 同时编辑  包含 root 的行 ,root 替换成 ROOT,并将行中所有 x 替换成 X

-ne 同时编辑  打印1到10行

###分组 s/ /代表查找替换  () 代表分组     \1 代表留下的第一     r:读取指定文件;

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

##### ifconfig 命令的输出中提取 ens33 网卡的 IP 地址。通过 sed 的正则表达式匹配,它会找到 包含 inet 字段的行,并从中提取出 IP 地址部分,然后输出这个 IP 地址

输出 ens33 的 IP

[root@localhost ~]# ifconfig ens33|sed -rn '2s/.*inet ([0-9.]+) .*/\1/p'

2s 第二行          .*inet  任意内容inet          ([0-9.]+)   0-9.            +匹配前面内容        \1第一组

10、读取完退出(q)

正常情况下sed会在读取完所有数据行之后退出,但是我们可以随时使用q指令来提前退出sed

[root@localhost ~]# sed '3q' passwd1         #表示仅显示处理后的结果   

 显示前3行

注意: q不要和-i一起使用,以免覆盖源文件

11sed脚本(-f)

有时我们需要对文件进行的增、删、改比较多,但是一条一条修改比较麻烦,所以对于指令比较多的情况,我们可以先将所有的sed指令写入一个文本文件中,然后通过sed-f选项读取该指令文件即可实现多指令操作

使用 sed 命令迁移符合条件的文本时,常用到以下参数 . 

H  :复制到剪贴板;

gG   :将剪贴板中的数据覆盖/追加至指定行

保存为文件

r  读取指定文件

追加指定内容

I,i   忽略大小写

[root@localhost ~]#sed '/the/{H;d};$G' test.txt                #把包含 the 行剪切到文件末尾

##将包含the 的行迁移至文件末尾 ,{;}用于多个操作   

  {H;d} 先复制再删除(剪切)$G 到文件末尾

[root@localhost ~]#sed '1,5{H;d};15G' test.txt                #1到5行剪切到15行后面 

##将第 1~5 行内容转移至第 17 行后           

[root@localhost ~]# vim shell.list

#! /bin/sed -f

1,5H

1,5d       1到5行 剪切到目标文件16行下面

 16G

[root@localhost ~]# sed -f shell.list ky35         

shell.list 脚本运用在 ky35 文件中

|| 表示上一条命令执行失败后,才执行下一条命令

使用脚本修改

[root@localhost ~]# vim test.sh

#!/bin/sed -f 

s/root/ROOT/g                      把全局root替换成ROOT

s/x/X/g                                   把全局x替换成X

s/\/sbin\/nologin/kgc/g           把全局/sbin/nologin替换成kgc

[root@localhost ~]# sed -f test.sh passwd1

#!/bin/sed -f  

1c hello world

2{

     p

     s/b/B/

 }

/root/{

s/x/H/

                s/root/ROOT/ 

}

注意:

.  sed脚本文件第一行要声明#!/bin/sed -f 

  不要加单引号

  每行的最后不能有空格等多余字符 .    #号开头为注释

  一行有多个命令时用分号隔开

注意: sed的返回值一般情况为0,不管是不是修改成功了,除非是语法错误 所以sed的返回值$?一般不作为sed成功的判断条件

12sed的高级应用

1-r 匹配正则

[root@localhost ~]# sed -r s/^[\t]*/#/ /etc/hosts.bak

将每一行开头的空白字符替换为#

2、结合变量使用

[root@localhost ~]# word=1111            #定义一个变量

[root@localhost ~]# sed '1a$word' /etc/hosts     

在 /etc/hosts 第一行下面添加  $word  ,(单引号把任何字符当普通字符看待)

[root@localhost ~]# sed "1a$word" /etc/hosts            #改成双引号就可以了  

在/etc/hosts 第一行下面添加 word 里的内容

[root@localhost ~]# sed '1a'"$word" /etc/hosts         #或者也可以各用各的符号

[root@localhost ~]# sed 1a$word /etc/hosts        #不用也可以

[root@localhost ~]# sed '$a'"$word" /etc/hosts   

#但是如果遇到想在最后一行后面添加的话就不能用双引号或者不用符号

在 /etc/hosts 最后一行下面添加 word 里的内容

[root@localhost ~]# sed "\$a$word" /etc/hosts     #如果要用双引号必须用转义符

13、生产案例

####sed 直接操作文件示例 生产案列

案列 1

需求:需要将ens33网络接口的IP地址修改为 192.168.190.31

cat /etc/sysconfig/network-scripts/ifcfg-ens33

sed -i 's/^IPADDR=.*/IPADDR=192.168.10.100/' /etc/sysconfig/network- scripts/ifcfg-ens33

#在原文件中修改,把以IPADDR开头=任意内容的行   替换成 IPADDR=192.168.190.30

sed -n '/^IPADDR/p' /etc/sysconfig/network-scripts/ifcfg-ens33

#打印包含以IPADDR开头的行
      IPADDR=192.168.190.30

案列 2

需求:需要将 Apache 的监听地址修改为 192.168.10.100,端口修改为 8080 # 修改监听地址

sudo sed -i 's/^Listen .*/Listen 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf

# 修改 ServerName

sed -i 's/^ServerName .*/ServerName 192.168.10.100:8080/' /etc/httpd/conf/httpd.conf

编写一个脚本,用来调整 vsftpd 服务配置,要求禁止匿名用户,但允许本地用户(也允许写入)。

案列3 脚本

[root@lo calhost ~]# vim local_only_ftp.sh #!/bin/bash

# 指定样本文件路径、配置文件路径

SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf " CONFIG="/etc/vsftpd/vsftpd.conf"

# 备份原来的在 , 若不存在则使用 cp 命令进行配置文件 ,检测文件名为/etc/vsftpd/vsftpd.conf.bak 备份文件是否存文件备份

[ ! -e "$CONFIG.bak" ] && cp $CONFIG $CONFIG.bak # 于样本配置进行调整 ,覆盖现有文件 sed -e '/^anonymous_enable/s/YES/NO/g' $SAMPLE > $CONFIG

sed -i -e '/^local_enable/s/NO/YES/g' -e '/^write_enable/s/NO/YES/g' $CONFIG grep "listen" $CONFIG || sed -i '$alisten=YES' $CONFIG

# 启动vsftpd 服务 ,并设为开机后自动运行 systemctl restart vsftpd

systemctl enable vsftpd

[root@localhost ~]# chmod +x local_only_ftp.sh

相关文章:

sed利用脚本处理文件

一、sed是什么 sed 命令是利用脚本来处理文本文件。它可以依照脚本的指令来处理、编辑文本文件。主要用来自动编 辑一个或多个文件、简化对文件的反复操作、编写转换程序等。 二、sed的原理 读入新的一行内容到缓存空间; 从指定的操作指令中取出第一条指令&…...

泰山派RK3566开发板800x1280MIPI屏设备树补丁

泰山派RK3566开发板800x1280MIPI屏设备树补丁 泰山派下800 X 1280分辨率MIPI屏调试,设备树补丁如下: https://download.csdn.net/download/qq_45143522/89584066 用kernel.patch文件,在泰山派内核源码下打补丁即可完成更新,或者…...

informer中的indexer机制的实现分析与源码解读

1. 背景 client-go工具下的tools/cache.indexer为informer提供缓存与索引的能力。可以实现快速通过索引找到对应的对象(pod, deployment,secret,configmap等)。 indexer再informer机制中的使用图示: indexer包括2部分: 一部分是store用于实际数据的存储,…...

英特尔宣布针对对Llama 3.1进行优化 以提升所有产品的性能

日前Meta正式发布了Llama 3.1开源大模型,以其庞大的参数量和卓越性能,首次在多项基准测试中击败了GPT-4o等业界领先的闭源模型。允许开发者自由地进行微调、蒸馏,甚至在任何地方部署,这种开放性为AI技术的普及和创新提供了无限可能…...

Python3网络爬虫开发实战(1)爬虫基础

一、URL 基础 URL也就是网络资源地址,其满足如下格式规范 scheme://[username:password]hostname[:port][/path][;parameters][?query][#fragment] scheme:协议,常用的协议有 Http,https,ftp等等;usern…...

Redis的五种数据类型与命令

目录 引言 一 Redis的特性 二 Redis的安装 三 Redis的优点 四 Redis的五种数据类型与命令 五 Redis的配置文件 引言 Redis是什么? Remote Dictionary Service(远程字典服务器) Redis 是一个开源的(BSD许可)的,C语言编写的,高性能的数…...

RocketMQ的详细讲解(四种mq的对比(activeMq、rabbitmq、rocketmq、kafka))

20240729 RocketMQ1 mq的三大作用 异步、削峰限流、解耦合2. 四种mq的对比(activeMq、rabbitmq、rocketmq、kafka)3 rocketmq特点1. 平台无关2. 能提供什么样的功能 4 rocketMq4.1 broker中的标题,来约束读和写4.2 rocketmq的结构4.3 读和写的…...

除了GPT,还有哪些好用的AI工具?

最强AI视频生成:小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频百万播放量https://aitools.jurilu.com/ 多得很,这20个免费的国产AI工具,打工人必备,除了比chatGPT好用,甚至还可以用来变现…...

04 | 深入浅出索引(上)

此系列文章为极客时间课程《MySQL 实战 45 讲》的学习笔记! 索引的常见模型 可以提供查询效率的数据结构有很多,常见的有三种:哈希表、有序数组、搜索数。 哈希表是一种以 key-value 形式存储的数据结构。输入一个 key,通过固定…...

Linux的yum源安装MySQL5.7

linux的yum源安装MySQL5.7 一、MySQL 1、简介 MySQL 是一种流行的关系型数据库管理系统(RDBMS),由瑞典公司 MySQL AB 开发,后来被 Oracle Corporation 收购。它是一个开源软件,提供了高效、稳定和可靠的数据管理解决…...

基于深度学习的音频自监督学习

基于深度学习的音频自监督学习(Self-Supervised Learning, SSL)是一种利用未标注的音频数据,通过设计自监督任务进行特征学习的方法。这种方法在需要大量标注数据的音频处理任务(如语音识别、情感分析等)中&#xff0c…...

用uniapp 及socket.io做一个简单聊天app1

####相关的表结构,用的是mysql 用户表(Users) 存储用户的基本信息。 CREATE TABLE Users (id INT AUTO_INCREMENT PRIMARY KEY,username VARCHAR(50) NOT NULL UNIQUE,password VARCHAR(100) NOT NULL,email VARCHAR(100) UNIQUE,created_a…...

在Postman中引用JS库

前言 在做接口测试时,出于安全因素,请求参数需要做加密或者加上签名才能正常请求,例如:根据填写的请求参数进行hash计算进行签名。postman作为主流的接口调试工具也是支持请求预处理的,即在请求前使用JavaScript脚本对…...

学习笔记-系统框图简化求传递函数公式例题

简化系统结构图求系统传递函数例题 基础知识回顾 第四讲 控制系统的方框图 (zhihu.com) 「自控原理」2.3 方框图的绘制及化简_方框图化简-CSDN博客 自动控制原理笔记-结构图及其等效变换_结构图等效变换-CSDN博客 例子一 「自控原理」2.3 方框图的绘制及化简_方框图化简-CS…...

postgrsql——事务概述

事务概述 事务的特性 原子性(Atomicity): 事务被视为一个整体,其中的操作要么全部执行成功,要么全部不执行,即不存在部分执行的情况。这确保了事务的完整性和一致性。一致性(Consistency&…...

1.Spring Boot 简介(Spring MVC+Mybatis-plus)

文章目录 一,Spring Boot 简介二,搭建springboot项目并整合mybatis-plus框架1.pom导依赖2.添加启动项3.配置文件.yml 三,springboot集成 Spring MVC1.springmvc定义2.应用注解 一,Spring Boot 简介 SpringBoot是Spring的子工程(或…...

《计算机网络》(学习笔记)

目录 一、计算机网络体系结构 1.1 计算机网络概述 1.1.1 计算机网络的概念 1.1.2 计算机网络的组成 1.1.3 计算机网络的功能 1.1.4 电流交换、报文交换和分组交换 1.1.5 计算机网络的分类 1.1.6 计算机网络的性能指标 1.2 计算机网络体系结构与参考模型 1.2.1 计算机…...

指针函数和函数指针

函数名在表达式中应该如何被解读?答:函数名可以在表达式中被解读成“指向该函数的指针”。 函数指针和指针函数有什么区别?答:函数指针是一个指向函数的指针;指针函数是一个返回指针变量的函数。 一个函数能否有时候…...

Elasticsearch跨集群搜索

Elasticsearch(简称ES)是一种基于Lucene的搜索引擎,以其高性能、可扩展性和实时搜索能力而广受欢迎。在大型分布式系统中,跨集群搜索成为了一个重要的需求,它允许用户从多个Elasticsearch集群中联合查询数据&#xff0…...

基于FPGA的数字信号处理(19)--行波进位加法器

1、10进制加法是如何实现的? 10进制加法是大家在小学就学过的内容,不过在这里我还是帮大家回忆一下。考虑2个2位数的10进制加法,例如:15 28 43,它的运算过程如下: 个位两数相加,结果为5 8 1…...

树莓派下,centos7操作系统, TensorFlow java版实现植物分类功能

在树莓派上运行CentOS 7,并使用TensorFlow Java版本实现植物分类功能可以通过以下步骤实现。以下是详细的指导: 一、安装和设置环境 1. 更新系统并安装基本工具 确保你的CentOS 7系统是最新的,并安装必要的工具: sudo yum update -y sudo yum install -y wget unzip gi…...

开源一个react路由缓存库

Github仓库 背景 产品希望可以像浏览器那样每打开一个路由,会多一个tab,用户可以切换tab访问之前加载过的页面,且不会重新加载。真就产品一句话…… Github上有轮子了吗 Github上开箱即用的轮子是基于react-router-dom V5实现的&#xff…...

go-kratos 学习笔记(7) 服务发现服务间通信grpc调用

服务发现 Registry 接口分为两个,Registrar 为实例注册和反注册,Discovery 为服务实例列表获取 创建一个 Discoverer 服务间的通信使用的grpc,放到data层,实现的是从uses服务调用orders服务 app/users/internal/data.go 加入 New…...

SPSS个人版是什么软件

SPSS是一款数据统计、分析软件,它由IBM公司出品,这款软件平台提供了文本分析、大量的机器学习算法、数据分析模型、高级统计分析功能等,软件易学且功能非常强大,可以使用SPSS制作图表,例如柱状、饼状、折线等图表&…...

Minos 多主机分布式 docker-compose 集群部署

参考 docker-compose搭建多主机分布式minio - 会bk的鱼 - 博客园 (cnblogs.com) 【运维】docker-compose安装minio集群-CSDN博客 Minio 是个基于 Golang 编写的开源对象存储套件,虽然轻量,却拥有着不错的性能 中文地址:MinIO | 用于AI的S3 …...

Unity + Hybridclr + Addressable + 微信小程序 热更新报错

报错时机: Generate All 怎么All 死活就是报错 生成微信小程序,并启动后 报错内容: MissingMethodException:AoT generic method notinstantiated in aot.assembly:Unity.ResourceManager:dll, 原因: Hybridclr 开发文档 解…...

鸿蒙开发—黑马云音乐之Music页面

目录 1.外层容器效果 2.信息区-发光效果 3.信息区-内容布局 4.播放列表布局 5.播放列表动态化 6.模拟器运行并配置权限 效果: 1.外层容器效果 Entry Component export struct MuiscPage {build() {Column() {// 信息区域Column() {}.width(100%)// .backgroun…...

IsaacLab | 如何在Manipulation任务中添加新的目标(target)

如是我闻: 终于让我给摸索出来了,在这里描述一下问题场景。 假使说我们有一个机械臂操作的任务,这样婶的 Isaac Lab | Push 我们想做多目标的任务,这时候需要向环境中添加第二个目标,像这样 Isaac Lab | Add target 那…...

【Python从入门到进阶】61、Pandas中DataFrame对象的操作(二)

接上篇《60、Pandas中DataFrame对象的操作(一)》 上一篇我们讲解了DataFrame对象的简介、基本操作及数据清洗相关的内容。本篇我们来继续讲解DataFrame对象的统计分析、可视化以及数据导出与保存相关内容。 一、DataFrame的统计分析 在数据分析和处理中…...

Linux(虚拟机)的介绍

Linux介绍 常见的操作系统 Windows:微软公司开发的一款桌面操作系统(闭源系统)。版本有dos,win98,win NT,win XP , win7, win vista. win8, win10,win11。服务器操作系统:winserve…...

CSS(九)——CSS 轮廓(outline)

CSS 轮廓(outline) 轮廓(outline)是绘制于元素周围的一条线,位于边框边缘的外围,可起到突出元素的作用。 轮廓(outline)属性指定元素轮廓的样式、颜色和宽度。 让我们用一个图来看…...

Unity Timeline:构建复杂动画序列的利器

Unity的Timeline是一个强大的动画工具,它允许开发者创建复杂的动画序列,将动画、音频和事件整合到一个统一的时间轴上。Timeline的可视化编辑界面使得动画制作变得更加直观和灵活。本文将介绍Unity Timeline的基本概念、功能以及如何使用它来实现动画。 …...

C# 与C++ cli

cli CLI(Command Line Interface)是一种通过命令行界面与计算机系统进行交互的方式。它提供了一种以文本形式输入命令和接收系统输出的方法,用于执行各种操作和管理计算机系统。以下是CLI的详细解释: 一、定义与基本概念 定义&…...

Linux文件编程--打开及创建

...

Vue3点击按钮实现跳转页面并携带参数

前提&#xff1a;有完整的路由规则 1.源页面 <template><div><h1>源页面</h1><!--通过js代码跳转--><template #default"scope"><button click"toTargetView(scope.row)">点击跳转携带参数</button><…...

探索Linux-1-虚拟机远程登陆XShell6远程传输文件Xftp6

Linux是什么&#xff1f; Linux是一个开源的操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。它基于Unix操作系统&#xff0c;但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分&#xff0c;负责管理系统资源、处理…...

SpringBoot中使用监听器

1.定义一个事件 /*** 定义事件* author hrui* date 2024/7/25 12:46*/ public class CustomEvent extends ApplicationEvent {private String message;public CustomEvent(Object source, String message) {super(source);this.message message;}public String getMessage() …...

mybatise全接触-面试宝典-知识大全

1 . 简述什么是Mybatis和原理 &#xff1f; Mybatis工作原理&#xff1a; &#xff08;1&#xff09;Mybatis是一个半ORM&#xff08;对象关系映射&#xff09;框架&#xff0c;它内部封装了JDBC&#xff0c;加载驱动、创建连接、创建statement等繁杂的过程&#xff0c;开发者…...

Catalyst优化器:让你的Spark SQL查询提速10倍

目录 1 逻辑优化阶段 2.1 逻辑计划解析 2.2 逻辑计划优化 2.2.1 Catalys的优化过程 2.2.2 Cache Manager优化 2 物理优化阶段 2.1 优化 Spark Plan 2.1.1 Catalyst 的 Join 策略 2.1.2 如何决定选择哪一种 Join 策略 2.2 Physical Plan 2.2.1 EnsureRequirements 规则 3 相关文…...

【Hot100】LeetCode—416. 分割等和子集

目录 题目1- 思路2- 实现⭐152. 乘积最大子数组——题解思路 3- ACM 实现 题目 原题连接&#xff1a;416. 分割等和子集 1- 思路 理解为背包问题 思路&#xff1a; 能否将均分的子集理解为一个背包&#xff0c;比如对于 [1,5,11,5]&#xff0c;判断能否凑齐背包为 11 的容量…...

前端开发知识-vue

大括号里边放键值对&#xff0c;即是一个对象。 一、vue可以简化前端javascript的操作。 主要特点是可以实现视图、数据的双向绑定。 使用vue主要分为三个步骤&#xff1a; 1.javascript中引入vue.js 可以src中可以是vue的网址&#xff0c;也可以是本地下载。 2.在javasc…...

【嵌入式硬件】快衰减和慢衰减

1.引语 在使用直流有刷电机驱动芯片A4950时,这款芯片采用的是PWM控制方式,我发现他的正转、反转有两种控制方式,分别是快衰减和慢衰减。 2.理解 慢衰减:相当于加在电机(感性原件)两端电压消失,将电机两端正负短接。 快衰减:相当于加在电机(感性原件)两端电压消失,将电机…...

C语言 | Leetcode C语言题解之第275题H指数II

题目&#xff1a; 题解&#xff1a; int hIndex(int* citations, int citationsSize) {int left 0, right citationsSize - 1;while (left < right) {int mid left (right - left) / 2;if (citations[mid] > citationsSize - mid) {right mid - 1;} else {left mi…...

速盾:网络安全和 CDN 之间的关系是怎样的?

网络安全和内容交付网络&#xff08;CDN&#xff09;之间有着密切的关系。网络安全主要涉及保护网络和系统免受各种威胁和攻击&#xff0c;而CDN是一种用于提供更快速、高效和可靠的内容交付服务的技术。在当今数字化和云计算时代&#xff0c;网络安全和CDN之间的关系变得更加紧…...

数据库安全:MySQL安全配置,MySQL安全基线检查加固

「作者简介」:冬奥会网络安全中国代表队,CSDN Top100,就职奇安信多年,以实战工作为基础著作 《网络安全自学教程》,适合基础薄弱的同学系统化的学习网络安全,用最短的时间掌握最核心的技术。 这一章节我们需要知道MySQL的安全基线标准和加固方式。 MySQL基线检查 1、更新…...

【SpringBoot】参数传递

1.定义URL变量 RequestMapping("/user/{username}") ResponseBody public String userProfile(PathVariable String username){ return "user:"username; } 2.定义多个URL变量 RequestMapping("/user/{username}/blog/{blogId}") Response…...

Unity 骨骼动画(Skinned Mesh Renderer): 角色动画的高级渲染

在Unity中&#xff0c;骨骼动画(Skinned Mesh Renderer)是一种用于高级角色动画渲染的组件。它允许开发者将复杂的3D模型和动画应用到游戏角色上&#xff0c;实现逼真的视觉效果。本文将探讨Skinned Mesh Renderer的基本概念、使用方法以及如何优化性能。 Skinned Mesh Render…...

花几千上万学习Java,真没必要!(三十四)

1、泛型类&#xff1a; 测试代码&#xff1a; 创建一个Box类; package settest.com; public class Box<T> { // T stands for "Type" - T是一个占位符&#xff0c;用于表示具体的类型 // 类的内部可以使用T作为类型声明变量 private T t; // 构造方法&am…...

【代码】Python3|Scrapy框架初探(汽车之家大连市二手车车辆数据爬取、清洗与可视化)

本篇主要是整个项目的介绍&#xff0c;没提到太多琐碎的技术细节&#xff0c;以后有空的话会整理一下 Scrapy 和原生爬虫的差异&#xff0c;还有它坑人的一些地方&#xff0c;单发出来。 开源地址&#xff1a;https://github.com/shandianchengzi/car_home_spider 使用说明&a…...

C#中的new以及类

new关键字的用法 实例化对象&#xff1a;使用 new 关键字可以创建一个类的实例。例如&#xff1a; ​ MyClass obj new MyClass(); 指定构造函数&#xff1a;如果类有多个构造函数&#xff0c;可以使用 new 关键字指定使用哪一个构造函数来创建对象。例如&#xff1a; ​ MyC…...