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

Shell编程之正则表达式与文本处理器

目录

一、引言

二、正则表达式

2.1 定义与用途

2.2 基础正则表达式

2.2.1 查找特定字符

2.2.2 利用中括号 “[]” 查找集合字符

2.2.3 查找行首 “^” 与行尾字符 “$”

2.2.4 查找任意一个字符 “.” 与重复字符 “*”

2.2.5 查找连续字符范围 “{}”

2.3 元字符总结

2.4 扩展正则表达式

三、文本处理器

3.1 sed 工具

3.1.1 工作流程

3.1.2 命令选项

3.1.3 操作命令

3.1.4 用法示例

 3.2 awk 工具

3.2.1 awk 工具概述与命令格式

3.2.2 awk 内建变量

3.2.3 awk 用法示例


一、引言

在 Shell 编程领域,正则表达式与文本处理器是极为关键的工具。正则表达式凭借其强大的字符串匹配能力,可精准定位符合特定规则的字符串;而 grep、sed、awk 等文本处理器,能高效处理文本内容,满足各类文本处理需求。掌握这些知识,对编写高效、灵活的 Shell 脚本意义重大,本笔记将深入学习相关内容。

二、正则表达式

2.1 定义与用途

正则表达式(Regular Expression,简称 RE),又称正规表达式、常规表达式,在代码中常简写为 regex、regexp 或 RE。它是用单个字符串描述、匹配一系列符合特定句法规则字符串的方法,在脚本编程、文本编辑器及多种编程语言中都占据核心地位。在 Shell 编程里,可利用正则表达式进行文本的查找、删除、替换等操作,提升文本处理效率。

2.2 基础正则表达式

学习基础正则表达式,需借助测试文件 test.txt,其内容如下:

he was short and fat. He was wearing a blue polo shirt with black pants.The home
of Football on BBC Sport online.
the tongue is boneless but it breaks bones.12!
google is the best tools for search keyword. The year ahead will test our political
establishment to the limit. P1=3.141592653589793238462643383249901429
a wood cross!
Actions speak louder than words
#woood #
#woooooood #
Axy zxyzxyzxyzC
I bet this place is really spooky late at night!
Misfortunes never come alone/single.
I shouldn't have lett so tast.
2.2.1 查找特定字符

使用 grep 命令查找特定字符。-n选项用于显示行号,-i选项表示不区分大小写,-v选项实现反向选择(查找不包含指定字符的行)。

  • 查找 “the” 所在位置:
[root@localhost ~]# grep -n 'the' test.txt
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword. 
6:The year ahead will test our political establishment to the limit.

  • 不区分大小写查找 “the”:
[root@localhost ~]# grep -in 'the' test.txt
3:The home of Football on BBC Sport online. 
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword. 
6:The year ahead will test our political establishment to the limit.

  • 查找不包含 “the” 的行:
[root@localhost ~]# grep -vn 'the' test.txt
1:he was short and fat. 
2:He was wearing a blue polo shirt with black pants. 
3:The home of Football on BBC Sport online. 
7:p13.141592653589793238462643383249901429
8:a wood cross!
9:Actions speak louder than words
10:
11:#woood #
12:#wo0000ood #
13:AxyzxyzxyzxyzC
14:I bet this place is really spooky late at night!
15:Misfortunes never come alone/single. 
16:I shouldn't have lett so tast.
2.2.2 利用中括号 “[]” 查找集合字符

“[]” 内的多个字符仅代表一个字符。

  • 查找 “shirt” 与 “short”:
[root@localhost ~]# grep -n 'sh[io]rt' test.txt
1:he was short and fat. 
2:He was wearing a blue polo shirt with black pants.

  • 查找包含重复单个字符 “oo” 的字符串:
[root@localhost ~]# grep -n 'oo' test.txt
3:The home of Football on BBC Sport online. 
5:google is the best tools for search keyword. 
8:a wood cross!
11:#woood #
12:#woo00oood #
14:I bet this place is really spooky late at night!

  • 查找 “oo” 前面不是 “w” 的字符串:
[root@localhost ~]# grep -n '[^w]oo' test.txt
3:The home of Football on BBC Sport online. 
5:google is the best tools for search keyword. 
11:#woood #
12:#wooo0oood #
14:I bet this place is really spoky late at night!

  • 查找不希望 “oo” 前面存在小写字母的字符串:
[root@localhost ~]# grep -n '[^a-z]oo' test.txt
3:The home of Football on BBC Sport online.

  • 查找包含数字的行:
[root@localhost ~]# grep -n '[0-9]' test.txt
4:the tongue is boneless but it breaks bones.12!
7:PI=3.141592653589793238462643383249901429
2.2.3 查找行首 “^” 与行尾字符 “$”

“^” 表示行首,“$” 表示行尾。

  • 查找以 “the” 为行首的行:
[root@localhost ~]# grep -n '^the' test.txt
4:the tongue is boneless but it breaks bones.12!

  • 查找以小写字母开头的行:
[root@localhost ~]# grep -n '^[a-z]' test.txt
1:he was short and fat. 
4:the tongue is boneless but it breaks bones.12!
5:google is the best tools for search keyword. 
8:a wood cross!

  • 查找以大写字母开头的行:
[root@localhost ~]# grep -n '^[A-Z]' test.txt
2:He was wearing a blue polo shirt with black pants. 
3:The home of Football on BBC Sport online. 
6:The year ahead will test our political establishment to the limit.
7:PI=3.141592653589793238462643383249901429
9:Actions speak louder than words
13:AxyzxyzxyzxyzC
14:I bet this place is really spooky late at night!
15:Misfortunes never come alone/single. 
16:I shouldn't have lett so tast.

  • 查找不以字母开头的行:
[root@localhost ~]# grep -n '^[^a-zA-Z]' test.txt
11:#woood #
12:#woo000ood #

  • 查找以小数点 “.” 结尾的行(“.” 是元字符,需用 “\” 转义):
[root@localhost ~]# grep -n '\.$' test.txt
1:he was short and fat. 
2:He was wearing a blue polo shirt with black pants. 
3:The home of Football on BBC Sport online. 
5:google is the best tools for search keyword.
6:The year ahead will test our political establishment to the limit. 
15:Misfortunes never come alone/single. 
16:I shouldn't have lett so tast.

  • 查找空白行:
[root@localhost ~]# grep -n '^$' test.txt
10:
2.2.4 查找任意一个字符 “.” 与重复字符 “*”

“.” 代表任意一个字符,“*” 代表重复零个或多个前面的单字符。

  • 查找 “w??d” 的字符串:
[root@localhost ~]# grep -n 'w..d' test.txt
5:google is the best tools for search keyword.
8:a wood cross!
9:Actions speak louder than words

  • 查找包含至少两个 “o” 以上的字符串:
[root@localhost ~]# grep -n 'ooo*' test.txt
3:The home of Football on BBC Sport online. 
5:google is the best tools for search keyword. 
8:a wood cross!
11:#woood #
12:#woo00oood #
14:I bet this place is really spooky late at night!

  • 查找以 “w” 开头 “d” 结尾,中间包含至少一个 “o” 的字符串:
[root@localhost ~]# grep -n 'woo*d' test.txt
8:a wood cross!
11:#woood #
12:#woooooood #

  • 查找以 “w” 开头 “d” 结尾,中间字符可有可无的字符串:
[root@localhost ~]# grep -n 'w.*d' test.txt
1:he was short and fat. 
5:google is the best tools for search keyword. 
8:a wood cross!
9:Actions speak louder than words
11:#woood #
12:#woo00oood #

  • 查找任意数字所在行:
[root@localhost ~]# grep -n '[0-9][0-9]*' test.txt
4:the tongue is boneless but it breaks bones.12!
7:PI=3.141592653589793238462643383249901429
2.2.5 查找连续字符范围 “{}”

“{}” 用于限制重复字符串的范围,在 Shell 中使用需转义。

  • 查找两个 “o” 的字符:
[root@localhost ~]# grep -n 'o\{2\}' test.txt
3:The home of Football on BBC Sport online. 
5:google is the best tools for search keyword. 
8:a wood cross!
11:#woood #
12:#wo0000ood #
14:I bet this place is really spooky late at night!

  • 查找以 “w” 开头以 “d” 结尾,中间包含 2 - 5 个 “o” 的字符串:
[root@localhost ~]# grep -n 'wo\{2,5\}d' test.txt
8:a wood cross!
11:#woood #

  • 查找以 “w” 开头以 “d” 结尾,中间包含 2 个或 2 个以上 “o” 的字符串:
[root@localhost ~]# grep -n 'wo\{2,\}d' test.txt
8:a wood cross!
11:#woood #
12:#woo00oood #

2.3 元字符总结

字符

描述

\

将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'n' 匹配字符 "n"。'\n' 匹配一个换行符。序列 '\\' 匹配 "\" 而 "\(" 则匹配 "("。

^

匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 '\n' 或 '\r' 之后的位置。

$

匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 '\n' 或 '\r' 之前的位置。

*

匹配前面的子表达式零次或多次。例如,zo* 能匹配 "z" 以及 "zoo"。* 等价于{0,}。

+

匹配前面的子表达式一次或多次。例如,'zo+' 能匹配 "zo" 以及 "zoo",但不能匹配 "z"。+ 等价于 {1,}。

?

匹配前面的子表达式零次或一次。例如,"do(es)?" 可以匹配 "do" 或 "does" 。? 等价于 {0,1}。

{n}

n 是一个非负整数。匹配确定的 n 次。例如,'o{2}' 不能匹配 "Bob" 中的 'o',但是能匹配 "food" 中的两个 o。

{n,}

n 是一个非负整数。至少匹配n 次。例如,'o{2,}' 不能匹配 "Bob" 中的 'o',但能匹配 "foooood" 中的所有 o。'o{1,}' 等价于 'o+'。'o{0,}' 则等价于 'o*'。

{n,m}

m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,"o{1,3}" 将匹配 "fooooood" 中的前三个 o。'o{0,1}' 等价于 'o?'。请注意在逗号和两个数之间不能有空格。

?

当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 "oooo",'o+?' 将匹配单个 "o",而 'o+' 将匹配所有 'o'。

.

匹配除换行符(\n、\r)之外的任何单个字符。要匹配包括 '\n' 在内的任何字符,请使用像"(.|\n)"的模式。

(pattern)

匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 '\(' 或 '\)'。

(?:pattern)

匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 "或" 字符 (|) 来组合一个模式的各个部分是很有用。例如, 'industr(?:y|ies) 就是一个比 'industry|industries' 更简略的表达式。

(?=pattern)

正向肯定预查(look ahead positive assert),在任何匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,"Windows(?=95|98|NT|2000)"能匹配"Windows2000"中的"Windows",但不能匹配"Windows3.1"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?!pattern)

正向否定预查(negative assert),在任何不匹配pattern的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如"Windows(?!95|98|NT|2000)"能匹配"Windows3.1"中的"Windows",但不能匹配"Windows2000"中的"Windows"。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。

(?<=pattern)

反向(look behind)肯定预查,与正向肯定预查类似,只是方向相反。例如,"(?<=95|98|NT|2000)Windows"能匹配"2000Windows"中的"Windows",但不能匹配"3.1Windows"中的"Windows"。

(?<!pattern)

反向否定预查,与正向否定预查类似,只是方向相反。例如"(?<!95|98|NT|2000)Windows"能匹配"3.1Windows"中的"Windows",但不能匹配"2000Windows"中的"Windows"。

x|y

匹配 x 或 y。例如,'z|food' 能匹配 "z" 或 "food"。'(z|f)ood' 则匹配 "zood" 或 "food"。

[xyz]

字符集合。匹配所包含的任意一个字符。例如, '[abc]' 可以匹配 "plain" 中的 'a'。

[^xyz]

负值字符集合。匹配未包含的任意字符。例如, '[^abc]' 可以匹配 "plain" 中的'p'、'l'、'i'、'n'。

[a-z]

字符范围。匹配指定范围内的任意字符。例如,'[a-z]' 可以匹配 'a' 到 'z' 范围内的任意小写字母字符。

[^a-z]

负值字符范围。匹配任何不在指定范围内的任意字符。例如,'[^a-z]' 可以匹配任何不在 'a' 到 'z' 范围内的任意字符。

\b

匹配一个单词边界,也就是指单词和空格间的位置。例如, 'er\b' 可以匹配"never" 中的 'er',但不能匹配 "verb" 中的 'er'。

\B

匹配非单词边界。'er\B' 能匹配 "verb" 中的 'er',但不能匹配 "never" 中的 'er'。

\cx

匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 'c' 字符。

\d

匹配一个数字字符。等价于 [0-9]。

\D

匹配一个非数字字符。等价于 [^0-9]。

\f

匹配一个换页符。等价于 \x0c 和 \cL。

\n

匹配一个换行符。等价于 \x0a 和 \cJ。

\r

匹配一个回车符。等价于 \x0d 和 \cM。

\s

匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。

\S

匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。

\t

匹配一个制表符。等价于 \x09 和 \cI。

\v

匹配一个垂直制表符。等价于 \x0b 和 \cK。

\w

匹配字母、数字、下划线。等价于'[A-Za-z0-9_]'。

\W

匹配非字母、数字、下划线。等价于 '[^A-Za-z0-9_]'。

2.4 扩展正则表达式

扩展正则表达式可简化指令,grep 命令仅支持基础正则表达式,使用扩展正则表达式需用 egrep 或 awk 命令。egrep 命令与 grep 用法相似,可搜索文件中的任意字符串和符号。

元字符含义示例及解释
+匹配前面的子表达式一次或多次,即至少出现一次。模式 go+gle 能匹配 googlegooogle 等,但无法匹配 gle
?匹配前面的子表达式零次或一次,也就是该字符可有可无。模式 colou?r 能匹配 color 和 colour
|表示或关系,用于匹配多个选择中的任意一个。模式 cat|dog 可以匹配 cat 或者 dog
()用于分组,将多个字符组合成一个整体,便于后续操作,还可用于后向引用。模式 (ab)+ 能匹配 ababab 等;(\d{3})-(\d{4}) 可将电话号码分为区号和号码两部分,方便后续引用。
{m,n}指定前面的子表达式出现的次数范围,m 是下限,n 是上限,都为非负整数且 m <= n。若省略 m,则表示 0 到 n 次;若省略 n,则表示至少 m 次。模式 a{2,4} 能匹配 aaaaaaaaaa{3,} 能匹配 aaaaaaa 等。

例如,查询除文件中空白行与行首为 “#” 之外的行,基础正则表达式需用管道命令搜索两次:

[root@localhost ~]# grep -v '^$' test.txt|grep -v '^#'

扩展正则表达式可简化为:

[root@localhost ~]# egrep -v '^$|^#' test.txt

三、文本处理器

3.1 sed 工具

sed(Stream EDitor)是强大且简单的文本解析转换工具,可读取文本并编辑,广泛应用于 Shell 脚本。

3.1.1 工作流程

sed 工作流程包括读取、执行和显示三个过程:

  1. 读取:从输入流(文件、管道、标准输入)读取一行内容到临时缓冲区(模式空间)。
  2. 执行:默认在模式空间顺序执行 sed 命令,除非指定行地址,否则在所有行依次执行。
  3. 显示:将修改后的内容发送到输出流,发送后清空模式空间。该过程重复直至所有内容处理完。默认情况下,输入文件不会改变,除非用重定向存储输出。
3.1.2 命令选项

常见 sed 命令选项:

选项完整形式说明
-e--expression=用指定命令或脚本来处理输入文本文件
-f--file=用指定的脚本文件来处理输入文本文件
-h--help显示帮助
-n--quiet、silent仅显示处理后的结果
-i直接编辑文本文件
3.1.3 操作命令

“操作” 指定对文件的动作行为,格式通常为 “[n1 [,n2]] 操作参数”,n1、n2 可选,代表操作的行数。常见操作:

操作说明
a在当前行下面增加一行指定内容
c将选定行替换为指定内容
d删除选定的行
i在选定行上面插入一行指定内容
p指定行则打印指定行,不指定则打印所有内容,有非打印字符以 ASCII 码输出,常与 “-n” 选项一起使用
s替换指定字符
y字符转换
3.1.4 用法示例

以 test.txt 文件为例:

  1. 输出符合条件的文本
    • 输出所有内容:
[root@localhost ~]# sed -n 'p' test.txt

  • 输出第 3 行:
[root@localhost ~]# sed -n '3p' test.txt

  • 输出 3 - 5 行:
[root@localhost ~]# sed -n '3,5p' test.txt

  • 输出所有奇数行:
[root@localhost ~]# sed -n 'p;n' test.txt

  • 输出所有偶数行:
[root@localhost ~]# sed -n 'n;p' test.txt

  • 输出第 1 - 5 行之间的奇数行:
[root@localhost ~]# sed -n '1,5{p;n}' test.txt

  • 输出第 10 行至文件尾之间的偶数行:
[root@localhost ~]# sed -n '10,${n;p}' test.txt

  • 输出包含 “the” 的行:
[root@localhost ~]# sed -n '/the/p' test.txt

  • 输出从第 4 行至第一个包含 “the” 的行:
    [root@localhost ~]# sed -n '4,/the/p

     3.2 awk 工具

  • 3.2.1 awk 工具概述与命令格式
    • awk 是功能强大的编辑工具,逐行读取文本,根据匹配模式查找、格式化输出或过滤处理。命令格式为:
      awk选项'模式或条件{编辑指令}'文件1文件2...
      awk -f脚本文件文件1文件2...
      
    • awk 倾向于将一行分成多个 “字段” 处理,默认字段分隔符为空格或 tab 键,可使用逻辑操作符和进行数学运算。
  • 3.2.2 awk 内建变量
    FS指定每行文本的字段分隔符,默认为空格或制表位
    NF当前处理的行的字段个数
    NR当前处理的行的行号(序数)
    $0当前处理的行的整行内容
    $n当前处理行的第 n 个字段(第 n 列)
    FILENAME被处理的文件名
    RS数据记录分隔,默认为\n,即每行为一条记录
  • 3.2.3 awk 用法示例
    • 按行输出文本:输出所有内容:
      awk '{print}' test.txt
      awk '{print $0}' test.txt
      

      输出第 1 - 3 行内容:
      awk 'NR==1, NR==3{print}' test.txt
      awk '(NR>=1)&&(NR<=3){print}' test.txt
      

相关文章:

Shell编程之正则表达式与文本处理器

目录 一、引言 二、正则表达式 2.1 定义与用途 2.2 基础正则表达式 2.2.1 查找特定字符 2.2.2 利用中括号 “[]” 查找集合字符 2.2.3 查找行首 “^” 与行尾字符 “$” 2.2.4 查找任意一个字符 “.” 与重复字符 “*” 2.2.5 查找连续字符范围 “{}” 2.3 元字符总结…...

TMDOG——语言大模型进行意图分析驱动后端实践

语言大模型进行意图分析驱动后端实践 项目概述 项目地址&#xff1a;https://github.com/TMDOG666/AI_Backend_Demo 该项目通过语言大模型&#xff0c;通过分析用户意图、拆分任务、构建API调用链来驱动后端实践。 以一个简单的教务系统后端为例&#xff0c;将教务系统后端…...

未启用CUDA支持的PyTorch环境** 中使用GPU加速解决方案

1. 错误原因分析 根本问题&#xff1a;当前安装的PyTorch是CPU版本&#xff0c;无法调用GPU硬件加速。当运行以下代码时会报错&#xff1a;model YOLO("yolov8n.pt").to("cuda") # 或 .cuda()2. 解决方案步骤 步骤1&#xff1a;验证CUDA可用性 在Pyth…...

【mysql】Mac 通过 brew 安装 mysql 、启动以及密码设置

Mac 通过 brew 安装 mysql 、启动以及密码设置 使用 brew 安装 mysqlmysql 启动mysql密码设置参考文章&#xff1a; 使用 brew 安装 mysql brew install mysqlmysql 启动 下载完毕&#xff0c;终端告诉我们mysql数据库没有设置密码的&#xff0c;我们可以直接执行 mysql -u r…...

Vue2 nextTick

核心源码位置 Vue 2 的 nextTick 实现主要在 src/core/util/next-tick.js 文件中。 完整源码结构 import { noop } from shared/util import { handleError } from ./error import { isIE, isIOS, isNative } from ./envexport let isUsingMicroTask falseconst callbacks …...

Ubuntu 安装 NVIDIA显卡驱动、CUDA 以及 CuDNN工具

文章目录 一、简介二、查看显卡设备三、安装显卡驱动四、安装CUDA工具箱五、安装CuDNN小结 一、简介 NVIDIA 驱动&#xff1a;操作系统与 NVIDIA 显卡硬件之间的桥梁&#xff0c;负责驱动显卡硬件的运行&#xff0c;显卡的“底层操作系统”&#xff0c;一切的基础。CUDA&#…...

LeetCode算法题(Go语言实现)_50

题目 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。 实现 SmallestInfiniteSet 类&#xff1a; SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。 int popSmallest() 移除 并返回该无限集中的最小整数。 void addBack(int num) 如果正整数 …...

idea报错java: 非法字符: ‘\ufeff‘解决方案

解决方案步骤以及说明 BOM是什么&#xff1f;1. BOM的作用2. 为什么会出现 \ufeff 错误&#xff1f;3. 如何解决 \ufeff 问题&#xff1f; 最后重新编译&#xff0c;即可运行&#xff01;&#xff01;&#xff01; BOM是什么&#xff1f; \ufeff 是 Unicode 中的 BOM&#xff0…...

WPF依赖注入IHostApplicationLifetime关闭程序

WPF依赖注入IHostApplicationLifetime关闭程序 使用Application.Current.Shutdown();退出会报异常 应该使用 app.Dispatcher.InvokeShutdown(); Application.Current.Shutdown();app.Dispatcher.InvokeShutdown();static App app new();[STAThread]public static void Main(…...

如何在 IntelliJ IDEA 中安装通义灵码 - AI编程助手提升开发效率

随着人工智能技术的飞速发展&#xff0c;AI 编程助手已成为提升开发效率和代码质量的强大工具。在众多 AI 编程助手之中&#xff0c;阿里云推出的通义灵码凭借其智能代码补全、代码解释、生成单元测试等丰富功能&#xff0c;脱颖而出&#xff0c;为开发者带来了全新的编程体验。…...

【力扣】两两交换链表中的节点

两两交换链表中的节点 代码&#xff1a; /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *n…...

数据共享交换平台之文件交换

数据共享交换平台的文件交换管理功能提供部门与部门之间的文件交换通道&#xff0c;满足跨部门之间文件交换需求。文件交换需要能够按照交换业务场景对交换通道进行分类管理。文件交换管理需满足如下要求&#xff1a; 1.文件交换统计&#xff1a;支持查看本部门与其他部门之间…...

什么是全球代理?如何选择全球代理服务?

在全球化不断深化的今天&#xff0c;互联网已经成为人类沟通、工作和学习的重要纽带。而全球代理则是这一纽带上的关键技术之一&#xff0c;它赋予了我们探索不同地区网络资源的能力。今天&#xff0c;我们来聊聊什么是全球代理、它能做什么&#xff0c;以及如何选择合适的全球…...

Spring Boot整合Kafka的详细步骤

1. 安装Kafka 下载Kafka&#xff1a;从Kafka官网下载最新版本的Kafka。 解压并启动&#xff1a; 解压Kafka文件后&#xff0c;进入bin目录。 启动ZooKeeper&#xff1a;./zookeeper-server-start.sh ../config/zookeeper.properties。 启动Kafka&#xff1a;./kafka-server-…...

【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——USB WIFI测试 #WIFI蓝牙二合一 #RTL8733BU

1&#xff09;实验平台&#xff1a;正点原子ATK-DLMP257B开发板 2&#xff09;浏览产品&#xff1a;https://www.alientek.com/Product_Details/135.html 3&#xff09;全套实验源码手册视频下载&#xff1a;正点原子资料下载中心 文章目录 第四章 ATK-DLMP257B功能测试——USB…...

Doip功能寻址走UDP协议

目前使用 connect()函数的UDP客户端 ,这里接收数据 解析的地方 查看一下。 如果使用 bind()、sendto()、recvfrom() 组合 那么返回值 和发送要在做调整&#xff0c;&#xff0c;根据业务需要后续在调整 其余的 和原来的 逻辑都是一样的&#xff0c;只是协议变了而已。 if serv…...

硬件电路设计之51单片机(2)

声明&#xff1a;绘制原理图和PCB的软件为嘉立创EDA。根据B站尚硅谷嵌入式之原理图&PCB设计教程学习所作个人用笔记。 目录 一、原理图详解 1、TypeC接口 &#xff08;1&#xff09;TypeC接口介绍 &#xff08;2&#xff09;TypeC原理图 2、5V转3.3V 3、单片机电源开…...

Deeplizard 深度学习课程(一)—— Pytorch 和 Tensor 简介

前言 该pytorch笔记参考deeplizard官方网站课程&#xff0c;有相应视频和博客&#xff0c;链接如下&#xff1a; deeplizardhttps://deeplizard.com/learn/video/v5cngxo4mIg 1.Pytorch 简介 PyTorch 是一个深度学习框架和一个科学计算包。PyTorch 的科学计算方面主要是 PyTo…...

Delphi HMAC算法

1. 前言 今天做一个三方接口&#xff0c;接口文档描述签名采用MD5&#xff0c;但是实际测试过程中&#xff0c;始终校验不通过&#xff0c;经过和三方沟通&#xff0c;才知道采用的是HMAC-MD5。由于Delphi7没有对HMAC的支持&#xff0c;则采用XE版本来支持。本次使用Delphi XE …...

Ubuntu服务器性能调优指南:从基础工具到系统稳定性提升

一、性能监控工具的三维应用 1.1 监控矩阵构建 通过组合工具搭建立体监控体系&#xff1a; # 实时进程监控 htop --sort-keyPERCENT_CPU# 存储性能采集 iostat -dx 2# 内存分析组合拳 vmstat -SM 1 | awk NR>2 {print "Active:"$5"MB Swpd:"$3"…...

深度解析C++开源OCR引擎:架构、编译优化与工业级部署指南

1. 引言:OCR技术演进与现状分析 光学字符识别(OCR)技术经历了从传统模式识别到深度学习的三代发展: 第一代:基于模板匹配(1970s-1990s) 第二代:特征提取+分类器(1990s-2010s) 第三代:端到端深度学习(2010s-至今) 当前工业界主流方案呈现"双轨制"发展态势…...

关于Newtonsoft.Json

历史 Newtonsoft.Json&#xff08;也称为 Json.NET&#xff09;是由 James Newton - King 开发的一个开源的 JSON 处理库&#xff0c;它于 2007 年首次发布。在早期&#xff0c;.NET 平台缺乏一个强大且灵活的 JSON 处理工具&#xff0c;Newtonsoft.Json 应运而生&#xff0c;…...

Spark-Sql编程(三)

一、数据加载与保存 通用方式&#xff1a;使用spark.read.load和df.write.save&#xff0c;通过format指定数据格式&#xff08;如csv、jdbc、json等&#xff09;&#xff0c;option设置特定参数&#xff08;jdbc格式下的url、user等&#xff09;&#xff0c;load和save指定路…...

CTF--好像需要管理员

一、原网页&#xff1a; 二、步骤&#xff1a; 1.扫描&#xff1a; 发现&#xff1a;robots.txt 2.打开robots.txt&#xff1a; 3.打开resul.php&#xff1a; 4.代码解析&#xff1a; if ($_GET[x]$password) //检查通过 URL 参数 x 传递的值是否等于变量 $password 的值 详…...

耀圣控制设备有限公司总经理李雨蔓的创业之路

破浪者李雨蔓&#xff1a;从零到行业标杆的铿锵之路 在浙江永嘉这片被誉为“中国泵阀之乡”的热土上&#xff0c;一位86年出生的女性企业家&#xff0c;用十年光阴书写了一段白手起家的传奇。她&#xff0c;是一曲关于勇气、智慧与匠心的赞歌。从技术员到行业标杆的缔造者&…...

Spring Boot JPA 开发之Not an entity血案

项目状况介绍 项目环境 JDK 21Spring Boot 3.4.3Hibernate: 6.6.13.Final项目描述 因为是微服务架构,项目层级如下 project-parent project-com project-A … project-X 其中: project-parent定义依赖库的版本project-com 定义了一些公用的方法和配置,包括持久层的配置。…...

什么是车规级MCU?STM32也能上车规级场景?

一、车规级MCU的定义 车规级MCU&#xff08;Microcontroller Unit&#xff09;是专为汽车电子系统设计的微控制器芯片&#xff0c;集成CPU、存储器、外设接口等功能模块&#xff0c;用于实现车辆控制、数据处理和实时响应。其核心特点包括&#xff1a; 高可靠性&#xff1a;需在…...

vue3.2 + element-plus 实现跟随input输入框的弹框,弹框里可以分组或tab形式显示选项

效果 基础用法&#xff08;分组选项&#xff09; 高级用法&#xff08;带Tab栏&#xff09; <!-- 弹窗跟随通用组件 SmartSelector.vue --> <template><div class"smart-selector-container"><el-popover :visible"visible" :w…...

go 指针接收者和值接收者的区别

go 指针接收者和值接收者的区别 指针接收者和值接收者的区别主要有两点&#xff1a; Go 中函数传参是传值&#xff0c;因此指针接收者传递的是接收者的指针拷贝&#xff0c;值接收者传递的是接收者的拷贝---在方法中指针接收者的变量会被修改&#xff0c;而值接收者的成员变量…...

部署qwen2.5-VL-7B

简单串行执行 from transformers import Qwen2_5_VLForConditionalGeneration, AutoProcessor from qwen_vl_utils import process_vision_info import torch, time, threadingdef llm(model_path,promptNone,imageNone,videoNone,imagesNone,videosNone,max_new_tokens2048,t…...

Go:测试

go test 工具 go test是 Go 语言包的测试驱动程序 &#xff0c;包依据特定约定组织 。包目录中以_test.go结尾的文件是go test编译对象&#xff0c;而非go build的编译目标 。 特殊测试函数 在*_test.go文件中有三种特殊函数 &#xff1a; 功能测试函数&#xff1a;以Test为…...

用微信小程序制作一个性行为同意协议系统

用微信小程序制作一个性行为同意协议系统 用微信小程序制作一个性行为同意协议系统&#xff0c;具备查询、修改、增加和演示的Web功能。首先&#xff0c;我需要明确这个系统的核心功能和法律合规性。性同意是一个敏感且法律相关的话题&#xff0c;必须确保系统的设计符合法律法…...

leetcode 122. Best Time to Buy and Sell Stock II

题目描述 这道题可以用贪心思想解决。 本文介绍用动态规划解决。本题分析方法与第121题一样&#xff0c;详见leetcode 121. Best Time to Buy and Sell Stock 只有一点区别。第121题全程只能买入1次&#xff0c;因此如果第i天买入股票&#xff0c;买之前的金额肯定是初始金额…...

FairyGUI图标文字合批失败的原因

1&#xff09;FairyGUI图标文字合批失败的原因 2&#xff09;为什么Cubemap的内存占用超高 3&#xff09;如何找到网格某个切面的中心点 4&#xff09;为什么SafeZone在倒屏后方向相反 这是第428篇UWA技术知识分享的推送&#xff0c;精选了UWA社区的热门话题&#xff0c;涵盖了…...

C/C++ 通用代码模板

✅ C 语言代码模板&#xff08;main.c&#xff09; 适用于基础项目、算法竞赛或刷题&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <math.h>// 宏定义区 #define MAX_N 1000 #defi…...

void MainWindow::on_btnOutput_clicked()为什么我在QT里面没有connect,也能触发点击效果

在 Qt 中&#xff0c;即使你没有显式调用 connect 函数&#xff0c;某些信号&#xff08;如按钮的 clicked() 信号&#xff09;仍然可以触发槽函数。这是因为 Qt 提供了一种自动连接机制&#xff0c;称为 自动连接&#xff08;Auto-Connection&#xff09;。以下是可能的原因和…...

基于YOLO11的车牌识别分析系统

【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】系统数据统计与可视化分析支持 【技术栈】 ①&#xff1a;系统环境&#xff1a;Windows/macOS/Linux ②&#xff1a;开发环境&#xff1a;Python 3.8 ③&#xff1a;技术栈&#x…...

openwebui搭建mcp

1、升级ollama https://github.com/ollama/ollama/blob/main/docs/faq.md curl -fsSL https://ollama.com/install.sh | shOllama 启动后&#xff0c;设置外网访问_ollama 外部访问-CSDN博客 ubuntu安装deepseek-CSDN博客 sudo vim /etc/systemd/system/ollama.serviceEnvi…...

邀请函 | 知从科技邀您共赴2025上海车展

2025上海车展将于4月23日至5月2日在国家会展中心&#xff08;上海&#xff09;盛大举行。本届车展以 “科技智驾未来”为主题&#xff0c;共同展示新能源汽车、智能驾驶等领域的最新技术与成果。 知从科技将携行业领先的软件产品与技术服务亮相于本次展览会&#xff0c;全方位…...

ESP32开发工具链选择指南:ESP-IDF vs PlatformIO vs Arduino

1. 引言 ESP32作为乐鑫&#xff08;Espressif&#xff09;推出的一款高性能Wi-Fi & Bluetooth双模芯片&#xff0c;凭借其强大的性能和丰富的生态&#xff0c;在物联网&#xff08;IoT&#xff09;领域广受欢迎。然而&#xff0c;开发ESP32时面临的一个关键问题是&#xf…...

【JAVA】bat文件启动jar场景获取bat文件路径的方法

一、推荐方案&#xff1a;参数传递法 步骤1&#xff1a;修改BAT脚本 echo off java -jar -Dbat.file"%~f0" your-app.jar %*关键参数说明&#xff1a; %~f0&#xff1a;获取BAT文件的完整路径%*&#xff1a;传递所有原始参数 步骤2&#xff1a;Java代码获取参数 …...

OpenLayers:extent与view extent 介绍

一、范围的概念 1.什么是范围&#xff1f; 在Openlayers中范围&#xff08;Extent&#xff09;是用于表示地理空间区域的一种概念。它通常由一个数字数组构成&#xff0c;数组中的内容为&#xff1a;[最小x坐标&#xff0c;最小y坐标&#xff0c;最大x坐标&#xff0c;最大y坐…...

Python开发一个简单的软件系统

用Python语言实现&#xff0c;具备录入学生成绩、查询成绩和显示所有成绩等基本功能。以下是代码&#xff1a; # 用于存储学生成绩的字典&#xff0c;键是学生姓名&#xff0c;值是成绩 student_scores {} # 录入学生成绩的函数 def input_scores(): name input("…...

小草GrassRouter多5G聚合路由设备在应急公安消防行业的解决方案及重要作用

小草GrassRouter多5G聚合路由设备在应急、公安、消防等行业的解决方案及重要作用主要体现在以下几个方面&#xff0c;这些领域对通信的高可靠性、高带宽、低时延需求尤为突出&#xff0c;尤其在复杂环境或突发事件中需要保障指挥调度的实时性和稳定性&#xff1a; ** 一、行业…...

冒泡排序、插入排序、快速排序、堆排序、希尔排序、归并排序

目录 冒泡排序插入排序快速排序(未优化版本)快速排序(优化版本)堆排序希尔排序归并排序各排序时间消耗对比 冒泡排序 冒泡排序核心逻辑就是对数组从第一个位置开始进行遍历&#xff0c;如果发现该元素比下一个元素大&#xff0c;则交换位置&#xff0c;如果不大&#xff0c;就…...

JVM知识

JVM 内存模型 JVM的内存模型介绍一下 根据 JVM8 规范&#xff0c;JVM 运行时内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 JVM的内存结构主要分为以下几个部分&#xff1a; 方法区&#xff1a;存放类对象 Java 虚拟机栈&#xff1a;存放方法之间的调…...

Docker 中多个容器之间的通信

在 Docker 中&#xff0c;多个容器之间的通信可以通过以下几种主要方式实现&#xff0c;具体选择取决于网络需求、隔离性及管理复杂度&#xff1a; 一、自定义 Bridge 网络&#xff08;推荐&#xff09; 通过创建自定义的 Docker 网络&#xff0c;容器可以加入同一网络并通过容…...

docker desktop for windows 登录国内镜像仓库

在使用 Docker Desktop for Windows 时&#xff0c;如果你希望连接到国内的 Docker 镜像仓库&#xff08;例如阿里云、腾讯云等&#xff09;&#xff0c;你可以通过配置 Docker 镜像加速器来实现。以下是一些步骤和示例&#xff0c;帮助你设置 Docker Desktop for Windows 以使…...

【blender小技巧】使用blender的Cats Blender Plugin插件将3D人物模型快速绑定或者修复为标准的人形骨骼

文章目录 前言绑定或者修复人形骨骼1、下载模型2、导入模型到blender中3、删除无用的相机和灯光3、导出模型并在unity中使用 专栏推荐完结 前言 有时候我们下载的3D人物模型&#xff0c;可能不带骨骼信息&#xff0c;或者带一些错乱的骨骼信息。这时候我们就可以使用blender将…...

视频压缩技术学习(不高明版本)

1. 压缩的本质与核心目标​​ 视频压缩的核心在于​​去除冗余信息​​&#xff0c;包括空间冗余&#xff08;相邻像素相关性&#xff09;、时间冗余&#xff08;连续帧相似性&#xff09;以及视觉冗余&#xff08;人眼感知特性&#xff09;。通过算法优化&#xff0c;在保持可…...