Shell编程之正则表达式与文本
目录
一 正则表达式
1 正则表达式的定义
2 正则表达式用途
二 正则表达式类型
1 基础正则表达式示例
(1)查找特定字符
(2)利用中括号” [] “来查找集合字符
(3)查找行首” ^ “与行尾字符”$“
(4)查找任意一个字符” .“ 与重复字符”*“
(5)查找连续字符范围”{}“
2 元字符总结
3 扩展正则表达式
4 扩展正则表达式和基础正则表达式的对比总结
三 文本处理器
1 sed工具
(1)输出符合条件的文本(p表示正常输出)
(2)删除符合条件的文本(d)
(3)替换符合条件的文本
(4)迁移符合条件的文本
(5)使用脚本编辑文件
(6)sed直接操作文件示例
2 awk工具
(1)按行输出文本
(2)按字段输出文本
(3)通过管道,双引号调用shell命令
3 sed工具和awk工具的对比总结
一 正则表达式
1 正则表达式的定义
正则表达式(Regular Expression,简称 regex 或 regexp)是一种用于描述字符串匹配规则的文本模式。它由普通字符(如字母、数字)和元字符(特殊符号)组成,通过特定的语法规则实现对字符串的搜索、匹配、替换或提取等操作。
核心特点:
-
是一种迷你语言,独立于编程语言(但各语言实现可能有细微差异)。
-
通过模式(pattern)匹配文本,而非直接比较字符串。
2 正则表达式用途
正则表达式的主要应用场景包括:
用途 | 说明 | 示例 |
---|---|---|
文本搜索 | 快速查找符合特定规则的字符串(如邮箱、电话号码)。 | 在日志中查找所有错误代码 ERROR:\d+ 。 |
数据验证 | 验证用户输入格式(如密码强度、邮箱合法性)。 | 检查密码是否包含大小写和数字 ^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,}$ 。 |
文本替换 | 批量替换符合规则的文本(如敏感词过滤、格式调整)。 | 将日期格式从 MM/DD/YYYY 替换为 YYYY-MM-DD 。 |
字符串提取 | 从复杂文本中提取特定部分(如网页中的URL、文件中的关键词)。 | 提取HTML中的链接 href="(.*?)" 。 |
文本分割 | 按规则拆分字符串(如CSV文件按分隔符分列)。 | 按逗号或分号分割 [,;] 。 |
日志分析 | 解析结构化日志数据(如提取时间戳、IP地址)。 | 匹配IP地址 \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b 。 |
代码处理 | 在IDE或编辑器中批量重构代码(如重命名变量、调整格式)。 | 替换所有 var 为 let 。 |
关键记忆点:
-
定义:用模式描述字符串规则的文本工具。
-
用途:搜索、验证、替换、提取、分割文本。
-
核心价值:高效处理复杂的字符串操作,减少手动编码。
二 正则表达式类型
1 基础正则表达式示例
语法 | 说明 | 示例 |
---|---|---|
查找特定字符 | 直接匹配指定的字符或字符串。 | "hello" 匹配文本中的 hello 。 |
中括号 [] | 匹配括号内的任意一个字符(字符集合)。 | [aeiou] 匹配任意一个元音字母。 |
行首 ^ 和行尾 $ | ^ 匹配行首,$ 匹配行尾。 | ^Hello 匹配以 Hello 开头的行。 |
任意字符 . 和重复字符 * | . 匹配任意单个字符(除换行符),* 匹配前一个字符 0 次或多次。 | h.*o 匹配 hello 、halo 等。 |
连续字符范围 {} | {n} 匹配前一个字符 n 次,{n,m} 匹配 n 到 m 次。 | a{2,4} 匹配 aa 、aaa 、aaaa 。 |
以下是正则表达式的语法:
(1)查找特定字符
语法:
grep -n [ 参数 ] 文本 //查找文本行号
grep -nv [ 参数 ] 文本 //查找文本行号相反的参数
语法示例:
(2)利用中括号” [] “来查找集合字符
范围表示法:
[a-z]
:匹配任意小写字母。
[A-Z]
:匹配任意大写字母。
[0-9]
:匹配任意数字。组合范围:
[a-zA-Z0-9]
匹配所有字母和数字。
特殊字符转义:
-
在
[]
内,大多数特殊字符(如.
、*
)会失去特殊含义,无需转义。 -
但以下字符需注意:
-
^
:仅在开头表示排除,其他位置作为普通字符。 -
-
:表示范围时(如a-z
),需放在开头或结尾避免歧义。 -
]
:需用\]
转义或放在开头。
-
语法示例:
(3)查找行首字符” ^ “与行尾字符”$“
语法:
行首字符” ^ “
^
匹配一行的开头位置(在行首之前的位置)。通常用于确保模式出现在行首。
行尾字符”$“
$
匹配一行的结尾位置(在行末换行符之前的位置)。通常用于确保模式出现在行尾。
语法示例:
grep '^hello' file.txt # 查找以 "hello" 开头的行
grep -v '^#' file.txt # 查找不以 `#` 开头的行(常用于过滤注释行)
grep 'world$' file.txt # 查找以 "world" 结尾的行
grep '^[A-Z]' file.txt # 查找以大写字母开头的行
grep '[0-9]$' file.txt # 查找以数字结尾的行
(4)查找任意一个字符” .“ 与重复字符”*“
在正则表达式中,.
(点)和 *
(星号)是两个核心元字符,分别用于匹配任意单个字符和重复前一个字符/模式。
语法示例:
grep -n 'w..d' test.txt
grep -n 'ooo*' test.txt
grep -n 'woo*d' test.txt
(5)查找连续字符范围”{}“
在正则表达式中,大括号 {}
用于指定 前一个字符或模式的重复次数,是精确控制匹配数量的重要工具。
语法示例:
# grep (BRE):需转义
echo "aaa" | grep 'a\{2\}'# grep (ERE):免转义
echo "aaa" | grep -E 'a{2}'# sed (BRE):需转义
echo "aaa" | sed -n '/a\{2\}/p'# sed (ERE):免转义
echo "aaa" | sed -E -n '/a{2}/p'
2 元字符总结
元字符 | 含义 |
---|---|
. | 匹配任意单个字符(除换行符 \n )。 |
^ | 匹配行首(在 [] 内表示取反,如 [^a] 匹配非 a 的字符)。 |
$ | 匹配行尾。 |
* | 匹配前一个字符 0 次或多次(贪婪匹配)。 |
+ | 匹配前一个字符 1 次或多次(需在扩展正则中使用)。 |
? | 匹配前一个字符 0 次或 1 次(也可用于非贪婪匹配,如 .*? )。 |
{n} | 匹配前一个字符 恰好 n 次。 |
{n,} | 匹配前一个字符 至少 n 次。 |
{n,m} | 匹配前一个字符 n 到 m 次。 |
[] | 匹配括号内的任意一个字符,如 [a-z] 匹配任意小写字母。 |
| | 或 匹配(需在扩展正则中使用),如 `cat dog |
() | 分组匹配,可用于提取或应用量词,如 (ab)+ 匹配 ab 、abab 等。 |
\ | 转义字符,用于匹配特殊字符本身,如 \. 匹配 . ,\* 匹配 * 。 |
3 扩展正则表达式
扩展正则表达式在基础正则(BRE)上增加了更强大的功能,通常需要加 -E
选项(如 grep -E
或 egrep
)。
扩展功能 | 说明 | 示例 |
---|---|---|
+ | 匹配前一个字符 1 次或多次(BRE 中需用 \{1,\} )。 | go+l 匹配 gol 、gooool 。 |
? | 匹配前一个字符 0 次或 1 次(BRE 中需用 \{0,1\} )。 | colou?r 匹配 color 或 colour 。 |
| | `或 匹配,可组合多个模式。 | `cat dog匹配 cat或 dog`。 |
() | 分组匹配,支持捕获组和反向引用。 | (ab)+ 匹配 abab 、ab 等。 |
\d , \w , \s | 预定义字符类(部分工具支持):\d 数字,\w 单词字符,\s 空白符。 | \d{3} 匹配 123 、456 等。 |
4 扩展正则表达式和基础正则表达式的对比总结
特性 | 基础正则表达式(BRE) | 扩展正则表达式(ERE) | 说明 |
---|---|---|---|
量词 | * , \{n,m\} | * , + , ? , {n,m} | ERE 支持更简洁的量词写法,BRE 需转义 {} 。 |
或匹配 | | 不支持(需 | 转义) | 支持 | ERE 可直接使用 | 表示“或”关系,BRE 需 `\ |
分组 () | \( \) (需转义) | () (直接使用) | ERE 分组无需转义,BRE 需写成 \(...\) 。 |
行首/行尾 | ^ , $ | ^ , $ | 两者相同。 |
字符集 [] | 支持 | 支持 | 两者相同。 |
非贪婪匹配 | 不支持(默认贪婪) | 支持 *? , +? | ERE 可用 ? 实现非贪婪匹配,BRE 无此功能。 |
预定义字符类 | 部分支持(如 \w 依赖工具) | 更广泛支持(如 \d , \s ) | ERE 在某些工具(如 grep -P )支持 Perl 风格正则。 |
适用工具 | grep , sed (默认) | grep -E , egrep , awk , Perl , Python | ERE 更现代,BRE 主要用于传统 Unix 工具。 |
关键区别:
-
语法简洁性
-
ERE 的
+
,?
,|
,()
等无需转义,BRE 需用\+
,\?
,\|
,\(\)
。 -
例如匹配
color
或colour
:-
BRE:
colou\?r
-
ERE:
colou?r
-
-
-
功能扩展性
-
ERE 支持非贪婪匹配(
.*?
)、或运算(|
)、更灵活的量词,BRE 功能受限。
-
-
工具兼容性
-
BRE 是传统 Unix 工具(如
grep
、sed
)的默认模式,ERE 需通过-E
选项或egrep
启用。 -
现代语言(如 Python、Perl)默认使用 ERE 或更强大的正则引擎(PCRE)。
-
如何选择?
-
使用 BRE:兼容老旧脚本或必须使用
sed
/grep
默认模式时。 -
使用 ERE:需要更简洁的语法和高级功能(如
|
、+
)时,优先选择grep -E
或awk
。
一句话总结:ERE 是 BRE 的增强版,语法更简洁、功能更强大,但需注意工具兼容性。
三 文本处理器
1 sed工具
sed
(Stream Editor)是一个强大的流式文本编辑器,主要用于对文本进行查找、替换、删除、插入等操作,支持正则表达式,适合批量处理文本。
sed的工作流程主要包括读取,执行和显示三个过程:
读取:将
"hello world"
读入模式空间。执行:依次执行替换命令 →
"Hi world"
→"Hi universe"
。显示:输出最终结果
"Hi universe"
。
sed语法:
sed [ 选项 ] “操作” 参数
sed [ 选项 ] -f scriptfile 参数
常见的sed命令选项主要包含以下几种:
选项 | 作用 |
-e (编辑脚本) | 指定要执行的编辑命令(可多次使用,连接多个命令) |
-f (从文件读取脚本) | 表使用指定的脚本文件来处理输入的文本文件 |
-h 或 --help | 显示帮助 |
-n (静默模式) | 表示仅显示处理后的结果 |
-i (直接修改文件) | 直接编辑源文件(谨慎使用,建议先备份或测试) |
-r (扩展正则表达式) | 启用扩展正则表达式 |
-l (行缓冲输出) | 指定输出行的长度(通常用于特殊设备或格式化) |
(1)输出符合条件的文本(p表示正常输出)
在正则表达式和文本处理工具(如 grep
、sed
、awk
)中,p
命令 或 print
动作 用于 显式输出符合条件的文本,通常与条件匹配结合使用。
语法示例:
grep 'pattern' file.txt # 输出包含 'pattern' 的整行
grep -o 'pattern' file.txt # 仅输出匹配 'pattern' 的部分
grep -Po 'pattern' file.txt # 支持 Perl 兼容正则(如非贪婪匹配 `.*?`)
sed -n '/pattern/p' file.txt # 仅输出匹配 'pattern' 的行(`-n` 抑制默认输出)
(2)删除符合条件的文本(d)
在文本处理工具(如 sed
、awk
、grep
)中,d
命令 或 delete
动作 用于 删除符合条件的文本行。
语法示例:
sed '/pattern/d' file.txt # 删除匹配 `pattern` 的行
sed '1,3d' file.txt # 删除第1~3行
sed '$d' file.txt # 删除最后一行sed '/pattern/!d' file.txt # 删除不匹配 `pattern` 的行(即保留匹配行)
sed -i '/error/d' log.txt # 直接删除文件中的错误行(原文件被修改)
awk '!/pattern/' file.txt # 删除匹配 `pattern` 的行(`!` 表示否定)
awk 'NR>3' file.txt # 删除前3行(保留行号大于3的行)
(3)替换符合条件的文本
在文本处理中,替换符合条件的文本是核心操作之一,主要通过 sed
、awk
、grep
(结合其他工具)等实现。
语法示例:
sed 's/原内容/替换内容/[flags]' file.txt
-
s
:替换命令 -
flags
常用选项:-
g
:全局替换(一行中所有匹配)。 -
i
:忽略大小写(如s/pattern/replace/i
)。 -
p
:打印替换成功的行(需与-n
配合)。
-
echo "hello world" | sed 's/world/China/' # 输出:hello China
echo "a b a" | sed 's/a/A/g' # 全局替换:A b A
sed -i 's/foo/bar/g' file.txt # 直接修改文件sed '2s/old/new/' file.txt # 仅替换第2行的内容
echo "2023-10-01" | sed 's/\([0-9]\{4\}\)-\([0-9]\{2\}\)/\2\/\1/'
# 输出:10/2023-01(分组重组)sed '/error/s/foo/bar/' file.txt # 仅在含 "error" 的行替换
(4)迁移符合条件的文本
作用:在指定位置插入、追加、替换或读取外部文件内容。
命令 | 说明 | 示例 |
---|---|---|
i | 在匹配行前插入 | sed '/pattern/i\new line' file |
a | 在匹配行后追加 | sed '/pattern/a\new line' file |
c | 替换匹配行 | sed '/pattern/c\replacement' file |
r | 读取文件并插入 | sed '/pattern/r otherfile' file |
w | 将匹配行写入文件 | sed '/pattern/w output.txt' file |
语法示例:
(5)使用脚本编辑文件
以下是关于 使用脚本编辑文件 的全面总结,涵盖常用工具(sed
、awk
、perl
等)、核心操作(替换、删除、插入)
语法示例:
sed -i 's/old/new/g' file.txt # 全局替换
sed '/pattern/s/old/new/' file.txt # 仅替换匹配行awk '{gsub(/old/, "new"); print}' file.txt > tmp && mv tmp file.txt
perl -pi -e 's/old/new/g' file.txt # 直接修改文件
(6)sed直接操作文件示例
#!/bin/bash
#指定样本文件路径,配置文件路径
SAMPLE="/usr/share/doc/vsftpd-3.0.2/EXAMPLE/INTERNET_SITE/vsftpd.conf"
CONFIG="/etc/vsftpd/vsftpd.conf"
#备份原来的配置文件,检测文件名为/etc/vsftpd/vsftpd.conf.bak备份文件是否存在,若不存在则使用cp命令进行文件备份
[ ! -e "$CONFIG.bak" ]&& cp $CONFIG $CONFIG.bak
#基于样本配置进行调整,覆盖现有文件
2 awk工具
awk
是一种强大的文本处理工具,擅长按行和列处理结构化数据(如日志、CSV 文件),支持变量、条件判断、循环等编程特性。
awk常用变量:
变量 | 含义 | 示例 |
---|---|---|
NR | 当前行号 | awk 'NR==1 {print}' (输出第 1 行) |
NF | 当前行的列数 | awk '{print NF}' (输出每行列数) |
FS | 输入字段分隔符(默认空格) | awk -F':' '{print $1}' |
OFS | 输出字段分隔符(默认空格) | awk 'BEGIN {OFS="-"}{print $1,$2}' |
FILENAME | 当前文件名 | awk '{print FILENAME}' |
awk语法:
awk [选项] '模式 {动作}' 文件名
- 选项:
awk
支持一些选项,如-F
用于指定字段分隔符。 - 模式:用于匹配输入行的条件,可以是正则表达式、比较表达式等。如果省略模式,则默认匹配所有行。
- 动作:在匹配到的行上执行的操作,通常是一系列的
awk
语句,用花括号{}
括起来。 - 文件名:要处理的输入文件。如果省略文件名,则从标准输入读取数据。
(1)按行输出文本
语法示例:
若要输出一个文件的所有行,可使用 print
语句,它会默认输出当前行。示例命令如下:
awk '{print}' filename.txt
在这个命令里,{print}
是 awk
的动作部分,print
函数会打印当前处理的行。filename.txt
是你要处理的文件名。若要从标准输入读取内容,可省略文件名,直接输入文本并按 Ctrl + D
结束输入。
awk '/^hello/ {print}' filename.txt
(2)按字段输出文本
awk
默认以空格或制表符作为字段分隔符,使用$n
来表示第n
个字段(n
是从 1 开始的正整数),$0
表示整行内容。
语法示例:
awk '{print $1}' data.txt //输出每行的第一个字段
awk '{print $1, $3}' data.txt //输出每行的第一个和第三个字段
awk -F ',' '{print $2}' info.csv //以逗号作为分隔符,输出每行的第二个字段
awk -F ',' 'NR > 1 {printf "%-10s %d\n", $2, $3}' info.csv
//以固定宽度输出名字和年龄
(3)通过管道,双引号调用shell命令
awk流量控制:
语法 | 示例 | 说明 |
---|---|---|
BEGIN{} | awk 'BEGIN {print "Start"}{print}' | 处理前执行 |
END{} | awk '{sum+=$1} END {print sum}' | 处理后执行 |
if 条件 | awk '{if($1>10) print $0}' | 条件判断 |
for 循环 | awk '{for(i=1;i<=NF;i++) print $i}' | 遍历列 |
语法:
{
# 要执行的 awk 操作
command = "shell 命令"
print $1 | command
close(command)
}
这里的 print $1
是把 $1
字段的内容通过管道传递给 command
所代表的 shell 命令。使用完管道后,需要用 close(command)
来关闭它,防止出现文件描述符泄漏的问题。
3 sed工具和awk工具的对比总结
sed
和 awk
是 Linux/Unix 中两大经典文本处理工具,虽然功能有部分重叠,但设计目标和适用场景差异显著。以下是它们的对比总结:
设计定位:
工具 | 核心定位 | 适用场景 |
---|---|---|
sed | 流编辑器(Stream Editor) | 以行为单位的文本替换、删除、插入等简单编辑操作。 |
awk | 模式扫描与处理语言(AWK Language) | 基于列/字段的复杂数据处理、计算、报表生成等。 |
核心功能对比:
特性 | sed | awk |
---|---|---|
处理单位 | 按行处理(默认操作单位是整行) | 按行处理,但可拆分字段(默认以空格/制表符分列) |
编程能力 | 支持简单命令,无变量和算术运算 | 支持变量、数组、循环、条件判断、函数等完整编程特性 |
文本替换 | 强项(s/old/new/ 语法高效) | 支持替换,但语法不如 sed 简洁 |
字段处理 | 弱(需依赖正则表达式截取字段) | 强(直接通过 $1 , $2 访问列) |
输出控制 | 简单输出或静默模式(-n + p ) | 灵活格式化输出(printf , print ) |
多行处理 | 有限(需借助保持空间/模式空间技巧) | 更灵活(可通过变量缓存多行数据) |
如何选用:
-
用
sed
如果:-
只需简单的行级编辑(如替换、删除)。
-
处理大文件时追求更高性能。
-
-
用
awk
如果:-
需要按列处理数据或数学计算。
-
任务涉及条件判断、循环或复杂逻辑。
-
相关文章:
Shell编程之正则表达式与文本
目录 一 正则表达式 1 正则表达式的定义 2 正则表达式用途 二 正则表达式类型 1 基础正则表达式示例 (1)查找特定字符 (2)利用中括号” [] “来查找集合字符 (3)查找行首” ^ “与行尾字符”$“ &…...
Spring JDBC 与数据访问:从性能优化到事务协同
在高并发场景(如电商、金融等行业),数据库访问的性能和事务一致性是系统稳定性的关键。 Spring JDBC通过模板化操作和事务管理机制,大幅简化了传统 JDBC 繁琐的 API 处理,使数据库操作更加高效、安全、可维护。 一、…...
Markdown 编辑器的使用
欢迎使用 Markdown 编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。 新的改变 我们对Markdown编辑器进行了一些功能拓展与语法支持&…...
自动化浏览器环境与 Node.js 环境的逆向分析:完整教程
在当今的 Web 开发中,了解浏览器环境与 Node.js 环境之间的差异是非常重要的,特别是当你希望进行自动化操作、逆向工程或进行跨平台开发时。在这篇教程中,我们将探讨如何通过 JavaScript 在浏览器中自动化环境检测、分析并对比 Node.js 和浏览…...
脉冲编码调制(PCM)在三角形信号中的应用
基于MATLAB平台,详细阐述脉冲编码调制(PCM)在三角形信号处理中的全流程实现。我这里将变量名更改为具有辨识度的Dogness_、Lhuu_,包括信号生成、均匀量化、编码、解码及解量化过程,为数字信号处理提供实践参考。 Dogne…...
# 03_Elastic Stack 从入门到实践(三)-- 4
03_Elastic Stack 从入门到实践(三)-- 4 七、Elasticsearch之中文分词器(IK分词器) 1、什么是分词? 分词:就是指将一个文本转化成一系列单词的过程,也叫文本分析,在Elasticsearch…...
前端VUE框架理论与应用(10)
1、记住全局注册的行为必须在根 Vue 实例 (通过 new Vue) 创建之前发生。 2、要注意,以 / 开头的嵌套路径会被当作根路径。 这让你充分的使用嵌套组件而无须设置嵌套的路径。 3、注意:在 Vue 实例内部,你可以通过 $router 访问路由实例。因此你可以调用 this.$router.push…...
基础学习:(6)nanoGPT
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1 nanoGPT 浅尝1.1 基础环境1.2 prepare.py1.2 train.py1.3 sample.py 2 再探gpt2.1 layer_norm2.2 KQV 和 self attention2.3 masked self-attention2.4 调用构…...
python支持自定义基准的相对误差计算
def is_within_tolerance_custom(a, b, tolerance0.1, reference“max”): “”" 支持自定义基准的相对误差计算。 参数:reference (str): 基准类型,可选 "max"(默认)、"min"、"mean"、"a"&am…...
力扣DAY52-54 | 热100 | 图论:腐烂的橘子、课程表、前缀树
前言 中等 √ 腐烂的橘子用层次遍历,课程表用俩哈希表,前缀树基本与题解一致。however不太规范。 腐烂的橘子 我的题解 层次遍历,先找出所有腐烂的橘子进入队列并记录数量,接着内层遍历第一层腐烂的橘子,上下左右四…...
java CountDownLatch用法简介
CountDownLatch倒计数锁存器 CountDownLatch:用于协同控制一个或多个线程等待在其他线程中执行的一组操作完成,然后再继续执行 CountDownLatch用法 构造方法:CountDownLatch(int count),count指定等待的条件数(任务…...
科技项目验收测试报告有哪些作用?需要多长时间和费用?
在当今快速发展的科技环境中,科技项目的有效验收至关重要。对于公司、开发团队以及客户来说,科技项目验收测试报告更是一个不可缺少的一项重要环节。 科技项目验收测试报告是对一个项目在开发完成后所进行的一系列测试结果的总结。这份报告不仅用于证明…...
网络原理面试题
1.如何理解 URI? URI, 全称为(Uniform Resource Identifier), 也就是统一资源标识符,它的作用很简单,就是区分互联网上不同的资源。但是,它并不是我们常说的网址, 网址指的是URL, 实际上URI包含了URN和URL两个部分,由于 URL 过于普及,就默认将 URI 视为 URL 了。 URI 的…...
专为路由器和嵌入式设备设计的OpenWrt是什么?
OpenWrt是一款基于Linux内核的开源嵌入式操作系统,专为路由器和嵌入式设备设计。自2004年诞生以来,它已成为替代商业固件的首选方案,凭借其高度可定制性、模块化架构和活跃的开发者社区,广泛应用于家庭网络、企业级设备、物联网(IoT)及安全领域。以下从多个维度展开详细介…...
NVIDIA RTX™ GPU 低成本启动零售 AI 场景开发
零售行业正在探索应用 AI 升级客户体验,同时优化内部流程。面对多重应用场景以及成本优化压力,团队可采用成本相对可控的方案,来应对多重场景的前期项目预演和落地,避免短期内大规模投入造成的资源浪费。 客户体验 AI 场景的研究…...
element-ui自定义主题
此处的element-ui为基于vue2.x的 由于https://element.eleme.cn/#/zh-CN/theme/preview(element的主题)报错503, 所以使用https://element.eleme.cn/#/zh-CN/component/custom-theme 自定义主题文档中,在项目中改变scss变量的方…...
PhotoShop学习10
1.画板功能的使用 使用画板功能可以轻松针对不同的设备和屏幕尺寸设计网页和 APP。画板是一种容器,类似于特殊图层组。画板中的图层在图层面板中,按画板进行分组。 使用画板,一个文档中可以有多个设计版面,这样可以在画板之间轻…...
基于LLVM设计领域专用语言(DSL)的步骤——以激光微加工为例
1. 明确DSL的设计目标 在激光微加工领域,DSL需解决以下问题: • 工艺参数抽象化:激光功率、频率、扫描路径等需用高阶语法描述,而非底层G代码。 • 实时性要求:控制指令需低延迟编译为机器码(如FPGA或运动控…...
【MAUI】IOS保活
文章目录 概述sevice使用 概述 每种方法都是独立的,可以根据应用的需求单独使用。例如,如果应用的主要功能是跟踪用户的地理位置,则可以仅使用后台定位;若是为了保持应用在后台运行以完成特定任务(比如上传数据&#…...
shardingsphere-jdbc集成Seata分布式事务
1、导入相关依赖 <!-- shardingsphere-jdbc --><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>shardingsphere-jdbc</artifactId><version>5.5.1</version></dependency><!-- shardingspher…...
基于区块链的技术应用探索
文章目录 前言一、区块链技术的核心特性1.1 去中心化1.2 不可篡改性1.3 透明性与可追溯性1.4 智能合约机制 二、区块链的典型应用场景2.1 金融与支付2.2 溯源与供应链管理2.3 数字身份与数据隐私2.4 数字资产与NFT2.5 公共服务与政务透明 三、区块链的分类1.按权限管理方式分类…...
MQ(RabbitMQ)消息重复消费问题的全面解决方案
MQ消息重复消费是分布式系统中的常见问题,主要由网络问题、消费者故障、消息重试机制等引起。以下是针对RabbitMQ的完整解决方案体系: 一、消息生产端解决方案 1. 消息幂等设计 全局唯一消息ID: MessageProperties props MessagePropert…...
windows Cursor 配置MCP的小坑
以高德地图MCP举例 按需求配置好以后,会提示 Client closed 解决方案, windows 需要更改一下 commandargs 新增一个npx保存后Cursor设置MCP页面Refresh一下即可,打开的终端不要关闭 最后贴一下文本代码,方便复制粘贴 {"m…...
探秘串口服务器厂家:背后的故事与应用
在科技飞速发展的今天,串口服务器作为连接串口设备与网络的桥梁,在工业自动化、智能交通、智能家居等众多领域发挥着关键作用。你是否好奇,那些生产串口服务器的厂家究竟有着怎样的故事?它们的产品背后又蕴含着怎样的原理呢&#…...
二叉树详细讲解(2/2)
4. 实现链式结构二叉树 ⽤链表来表⽰⼀棵⼆叉树,即⽤链来指⽰元素的逻辑关系。通常的⽅法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别⽤来给出该结点左孩⼦和右孩⼦所在的链结点的存储地址,其结构如下&#…...
SpringBoot整合Redis限流
通过一个完整的Spring Boot项目演示如何用Redis实现简单的API限流功能。我们将从零开始搭建项目。 一、环境准备 1.1 开发环境要求 JDK 1.8IntelliJ IDEA(推荐)Redis 5.0(本地安装)Postman(测试用) 1.2…...
(Matlab)自动驾驶仿真 设计驾驶场景、配置传感器并生成合成 数据
驾驶场景仿真平台核心功能 一、场景搭建与编辑 可视化场景构建 使用拖放界面创建道路网络和角色模型(车辆、行人等)支持欧洲新车评估计划(Euro NCAP)测试协议及其他预置场景模板 二、传感器配置 车载传感器系统 支持…...
接口测试(get请求方法)-----------实战演练
1.最简单的get请求方法 eg:请求一个王者荣耀语音包的接口 接口文档如下: 2.把接口地址、请求方法、请求参数写到postman相应位置 3.填写请求参数的值,点击发送按钮,即可获得到返回参数...
【赵渝强老师】TiDB的列存引擎:TiFlash
TiDB的TiFlash提供列式存储,且拥有借助ClickHouse高效实现的协处理器层。除此以外,它与TiKV非常类似,依赖同样的Multi-Raft体系,以Region为单位进行数据复制和分散。TiFlash以低消耗不阻塞TiKV写入的方式,实时复制TiKV…...
《vue3学习手记3》
标签的ref属性 vue3和vue2中的ref属性: 用在普通DOM标签上,获取的是DOM节点 ref用在组件标签上,获取的是组件实例对象 区别在于: 1.vue3中person子组件中的数据父组件App不能直接使用,需要引入并使用defineExpose才可…...
【Vue】从 MVC 到 MVVM:前端架构演变与 Vue 的实践之路
个人博客:haichenyi.com。感谢关注 一. 目录 一–目录二–架构模式的演变背景三–MVC:经典的分层起点四–MVP:面向接口的解耦尝试五–MVVM:数据驱动的终极形态六–Vue:MVVM 的现代化实践 二. 架构模…...
Docker Compose 命令实现动态构建和部署
Docker Compose 命令实现动态构建和部署 一、编写支持动态版本号的 docker-compose.yml version: 3.8services:myapp:build: context: . # Dockerfile所在目录args:APP_VERSION: ${TAG:-latest} # 从环境变量获取版本号,默认latestimage: myapp:${TAG:-latest} …...
工厂模式实现案例
场景一:配置文件解析(工厂模式实现) 1. 定义解析器接口与具体实现 from abc import ABC, abstractmethod import json import yaml # 需要安装PyYAML库:pip install pyyamlclass ConfigParser(ABC):"""配置文件解…...
Vue3.5 企业级管理系统实战(十五):其他全局设置项
在设置面板中,除了主题颜色的选择设置,还可以添加其他全局配置选项,如 tagsView 导航栏,Logo 的显示隐藏配置等。 1 Settings 的 Pinia 配置 在 src/stores/settings.ts 中添加要持久存储的全局配置项,这里是 tagsVi…...
L2-052 吉利矩阵分
L2-052 吉利矩阵 - 团体程序设计天梯赛-练习集 所有元素为非负整数,且各行各列的元素和都等于 7 的 33 方阵称为“吉利矩阵”,因为这样的矩阵一共有 666 种。 本题就请你统计一下,把 7 换成任何一个 [2,9] 区间内的正整数 L,把矩…...
408 计算机网络 知识点记忆(9)
前言 本文基于王道考研课程与湖科大计算机网络课程教学内容,系统梳理核心知识记忆点和框架,既为个人复习沉淀思考,亦希望能与同行者互助共进。(PS:后续将持续迭代优化细节) 往期内容 408 计算机网络 知识…...
矩阵基础+矩阵转置+矩阵乘法+行列式与逆矩阵
GPU渲染过程 矩阵 什么是矩阵(Matrix) 向量 (3,9,88) 点乘:计算向量夹角 叉乘:计算两个向量构成平面的法向量。 矩阵 矩阵有3行,2列,所以表示为M32 获取固…...
如何在 .NET 环境中使用 Npgsql 驱动连接 KaiwuDB
在现代软件开发中,数据库连接和操作是任何应用程序的核心部分。本文将介绍如何在 .NET 环境下,使用 Npgsql 驱动连接 KaiwuDB,并执行基本的数据库操作,包括创建表、插入数据和查询操作。我们假设您已经安装并配置好了 KaiwuDB 数据…...
【代理错误 django】Request error: HTTPSConnectionPool(host=‘‘, port=443): 、
❗问题 ❶:仍然是代理错误(ProxyError) 错误日志: Request error: HTTPSConnectionPool(hostxueshu.baidu.com, port443): Max retries exceeded ... Caused by ProxyError(Unable to connect to proxy, FileNotFoundError(2, N…...
5.9 《GPT-4调试+测试金字塔:构建高可靠系统的5大实战策略》
5.4 测试与调试:构建企业级质量的保障体系 关键词:测试金字塔模型、GPT-4调试助手、LangChain调试模式、异步任务验证 测试策略设计(测试金字塔实践) #mermaid-svg-RblGbJVMnCIShiCW {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill…...
Maven 多仓库和多镜像配置
Maven是一个流行的Java项目构建和管理工具。在Maven中,我们可以配置多个仓库源来下载和管理依赖项。同时,我们还可以使用repositories和mirrors进行配置,以满足特定的需求。 首先,让我们了解一下repositories和mirrors的作用。在M…...
案例驱动的 IT 团队管理:创新与突破之路:第五章 创新管理:从机制设计到文化养成-5.1 创新激励体系-5.1.3失败案例的价值转化机制
👉 点击关注不迷路 👉 点击关注不迷路 👉 点击关注不迷路 文章大纲 失败案例的价值转化机制:IT团队创新管理中的"黑天鹅"炼金术1. 认知重构:重新定义失败的价值1.1 传统失败管理的困境1.2 失败价值转化模型 …...
华为纯血 卓易通 使用记录
(1)我们在测试华为纯血的时候,发现了,使用咱们的基站上的wifi, wifi与手机终端是互相ping 通的, 手机可以发信号到基站,但基站收到信号后,也发出信号 ,但信号 不能到达手机。 这个是…...
计算机网络中科大 - 第7章 网络安全(详细解析)-以及案例
目录 🛡️ 第8章:网络安全(Network Security)优化整合笔记📌 本章学习目标 一、网络安全概念二、加密技术(Encryption)1. 对称加密(Symmetric Key)2. 公钥加密࿰…...
初识Redis · set和zset
目录 前言: set 基本命令 交集并集差集 内部编码和应用场景 zset 基本命令 交集并集差集 内部编码和应用场景 应用场景(AI生成) 排行榜系统 应用背景 设计思路 热榜系统 应用背景 设计思路 热度计算方式 总结对比表 前言&a…...
Prometheus+Grafana+K8s构建监控告警系统
一、技术介绍 Prometheus、Grafana及K8S服务发现详解 Prometheus简介 Prometheus是一个开源的监控系统和时间序列数据库,最初由SoundCloud开发,现已成为CNCF(云原生计算基金会)的毕业项目。它专注于实时监控和告警,特别适合云原生和分布式…...
用 AI + 前端实现一个简易产品图生成器:上传商品标题 → 多场景展示图自动生成
文章目录 一、项目背景与功能概述核心功能: 二、技术选型与环境准备安装依赖与 API Key 配置 三、核心功能模块实现1. 商品图生成器核心逻辑2. 组件模板与 UI 结构 四、功能拓展与优化建议(附代码思路)✅ 1. 本地历史记录可视化✅ 3. 支持图片…...
实现高效灵活的模糊搜索:JavaScript中的多条件过滤实践
现代Web应用中,数据搜索功能是用户体验的关键部分。本文将深入探讨如何实现一个高效灵活的模糊搜索函数,支持多条件组合查询、精确匹配、模糊匹配以及时间范围筛选。 需求分析 我们需要一个通用的搜索函数,能够处理以下场景: 多…...
ChatterBot的JupyterLab实践指南,从零开始构建AI聊天机器人
从手机上的语音助手到电商平台的客服机器人,这些能理解人类语言的程序背后,都离不开自然语言处理(NLP)技术的支撑。本文将以JupyterLab为实验平台,带您亲手打造一个会对话的AI机器人。通过这个项目,您不仅能…...
《深度学习》课程之卷积神经网络原理与实践教学设计方案
《深度学习》课程之卷积神经网络原理与实践教学设计方案 一、教学目标设计 (一)知识目标 学生能够准确描述卷积神经网络(CNN)的基本定义,包括其核心组成部分(如卷积层、池化层、全连接层等)及…...