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

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

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

相关文章

【时时三省】(C语言基础)分支语句2

山不在高,有仙则名。水不在深,有龙则灵。 ——csdn时时三省 多分支语句 if(表达式1) 语句1; else if(表达式2) 语句2; else 语句3; 如果表达式1成立语句1会执行 如果不成立表达式2执行 如果表达式2成…

【运维笔记】数据库无法启动,数据库炸后备份恢复数据

事情起因 在做docker作业的时候,把卷映射到了宿主机原来的mysql数据库目录上,宿主机原来的mysql版本为8.0,docker容器版本为5.6,导致翻车。 具体操作 备份目录 将/var/lib/mysql备份到~/mysql_backup:cp /var/lib/…

Multiview LM-ICP 配准算法

Multiview LM-ICP 配准算法针对一些大型的物体(比如建筑物)或者需要精细化建模的物体(比如某个文物),仅仅进行成对的配准难以还原物体的全貌和细节。所以,多个视角的配准十分关键。 多视角的配准存在以下两…

[STM32]FlyMcu同时烧写BootLoader和APP文件-HEX文件组成

目录 一、前言 二、HEX文件的格式 三、组合HEX文件 四、使用FlyMcu烧录 一、前言 如题,BootLoader每次烧写都是全部擦除,当我们烧写APP程序的时候,BootLoader程序将不复存在,很多开发者或许只有USB转TTL模块,没有其…

grep命令搜索部分命令

首先 然后可以输入|以及grep命令 比如 bjobs| grep "3075*"bjobs| grep "3075"这个结果是这样的,

MYSQL 第四次作业

任务要求: 具体操作: 新建数据库: mysql> CREATE DATABASE mydb15_indexstu; Query OK, 1 row affected (0.01 sec) mysql> USE mydb15_indexstu; Database changed 新建表: mysql> CREATE TABLE student( ->…

遇到总条数count(*)返回不了数据

文章目录 前提1.准备数据1.1 建表语句1.2 插入数据 2.程序代码3.返回结果与分析4.验证 前提 获取h_user表中count(*)字段的值打印出来,打印出来是0,数据库中执行sql返回不是0。端点调试找到原因。下面先把数据库表数据及程序贴出来。 1.准备数据 1.1 …

CSS技巧专栏:一日一例 12 -纯CSS实现边框上下交错的按钮特效

CSS技巧专栏:一日一例 12 -纯CSS实现边框上下交错的按钮特效 大家好,今天我们来做一个上下边框交错闪动的按钮特效。 本例图片 案例分析 虽说这按钮给人的感觉就是上下两个边框交错变换了位置,但我们都知道border是没法移动的。那么这个按…

【无标KaiwuDB CTO 魏可伟:差异化创新,面向行业的多模架构题】

2024年7月16日,KaiwuDB CTO 魏可伟受邀于 2024 可信数据库发展大会主论坛发表演讲《多模一库 —— KaiwuDB 的现代数据库架构探索》,以下是演讲精华实录。 多模数据库 是顺应时代发展与融合趋势的产物 数据模型最早始于网状模型和层次模型,…

Spark实时(五):InputSource数据源案例演示

文章目录 InputSource数据源案例演示 一、​​​​​​​File Source 1、读取text文件 2、读取csv文件 3、读取json文件 二、Socket Source 三、Rate Source InputSource数据源案例演示 在Spark2.0版本之后,DataFrame和Dataset可以表示静态有边界的数据&am…

移动式气象站:便携科技的天气守望者

在科技日新月异的今天,我们身边的许多设备都在向着更加智能化、便携化的方向发展。而在气象观测领域,移动式气象站的出现,不仅改变了传统气象观测的固有模式,更以其灵活性和实时性,在气象监测、灾害预警等领域发挥着越…

MySQL练习05

题目 步骤 触发器 use mydb16_trigger; #使用数据库create table goods( gid char(8) primary key, name varchar(10), price decimal(8,2), num int);create table orders( oid int primary key auto_increment, gid char(10) not null, name varchar(10), price decima…

基于python的BP神经网络红酒品质分类预测模型

1 导入必要的库 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.preprocessing import LabelEncoder from tensorflow.keras.models import Sequential from tenso…

NET8部署Kestrel服务HTTPS深入解读TLS协议之Certificate证书

Certificate证书 Certificate称为数字证书。数字证书是一种证明身份的电子凭证,它包含一个公钥和一些身份信息,用于验证数字签名和加密通信。数字证书在网络通信、电子签名、认证授权等场景中都有广泛应用。其特征如下: 由权威机构颁发&…

跟李沐学AI:池化层

目录 二维最大池化 填充、步幅和多个通道 平均池化层 池化层总结 二维最大池化 返回滑动窗口中的最大值。 图为池化窗口形状为 22 的最大池化层。着色部分是第一个输出元素,以及用于计算这个输出的输入元素: max(0,1,3,4)4。池化层与卷积层类似,不断…

单元测试的最佳实践

整体架构 合适的架构可以提升可测试性。比如菱形对称架构的模块化和解耦特性使得系统各个部分可以独立进行单元测试。这不仅提高了测试的效率,还能够减少测试的依赖性,提高测试准确性。 代码设计 代码设计和可测试性有密切关联。强烈建议一个方法的代码行…

Android 15 适配整理——实践版

背景 谷歌发布Android 15后,国内的手机厂商迅速行动,开始了新系统的适配工作。小米、OPPO、vivo和联想等金标联盟成员联合发布了适配公告,督促APP开发者在2024年8月31日前完成适配工作,否则将面临搜索标签提示、应用降级、分机型…

JavaWeb笔记_JSTL标签库JavaEE三层架构案例

一.JSTL标签库 1.1 JSTL概述 JSTL(jsp standard tag library):JSP标准标签库,它是针对EL表达式一个扩展,通过JSTL标签库与EL表达式结合可以完成更强大的功能 JSTL它是一种标签语言,JSTL不是JSP内置标签 JSTL标签库主要包含: ****核心标签 格式化标签 …

Android平台轻量级RTSP服务模块二次封装版调用说明

技术背景 在前面的blog,我们发布了Android平台轻量级RTSP服务模块的技术对接说明,好多开发者希望,更黑盒的对接轻量级RTSP服务这块,专注于自身业务逻辑。为此,我们针对Android平台轻量级RTSP服务模块,做了…

解析capl文件生成XML Test Module对应的xml工具

之前一直用的CAPL Test Module来写代码,所有的控制都是在MainTest()函数来实现的,但是有一次,代码都写完了,突然需要用xml的这种方式来实现,很突然,之前也没研究过,整理这个xml整的一身汗&#…