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

一、正则表达式基础

1. 正则表达式概述

定义​:正则表达式(Regular Expression,简称Regex)是由普通字符​(如字母、数字、标点符号)与元字符​(具有特殊含义的专用字符)组成的字符串匹配规则,用于判断某字符串是否符合特定格式要求。

核心作用​:在Shell脚本中,通过文本处理工具(如grepsedawk)结合正则表达式,可以快速筛选、提取或修改目标文本内容,是自动化运维、日志分析、数据清洗等场景的基础技能。

类比理解​:正则表达式类似于“文本搜索的精准模板”——普通字符按字面意义匹配,元字符则定义了匹配的“规则模式”(如“任意字符”“重复次数”“开头/结尾位置”等)。


2. 正则表达式分类

根据POSIX(可移植操作系统接口)标准,正则表达式分为两大类,主要区别在于元字符的语法格式(是否需要转义)及支持的工具:

类型

支持工具

核心区别

典型使用场景

基本正则表达式(BRE,Basic Regular Expression)​

grep(默认)、sed(默认)、awk(部分支持)

元字符(如\{n\}\{n,\})需通过反斜杠``转义,语法相对严格。

简单文本过滤(如查找固定模式的行)。

扩展正则表达式(ERE,Extended Regular Expression)​

egrep(或grep -E)、awk(默认支持大部分ERE)、sed(配合-r选项)

元字符(如{n}{n,})无需转义,语法更简洁直观。

复杂模式匹配(如分组、逻辑“或”操作)。

关键区别示例​:

  • 匹配连续2个o

    • BRE(需转义):go\{2\}d(如grep "go\{2\}d" file

    • ERE(无需转义):go{2}d(如egrep "go{2}d" filegrep -E "go{2}d" file

工具默认行为​:

  • grep:默认使用BRE,若需使用ERE需加-E参数(或直接使用egrep)。

  • sed:默认使用BRE,若需使用ERE需加-r参数(部分新版本支持-E)。

  • awk:默认支持大部分ERE语法(如+?|无需转义)。


二、正则表达式核心元字符详解

1. 通用元字符(BRE与ERE均适用)

这些元字符在基本正则和扩展正则中功能一致,但部分在BRE中需要转义。

元字符

含义

用法示例

匹配示例

^

匹配字符串的开头位置

^a:匹配以字母a开头的行(如apple)。
^#:匹配以#开头的行(如注释行)。

^gd:匹配以gd开头的行。

$

匹配字符串的结尾位置

d$:匹配以字母d结尾的行(如god)。
^$:匹配空行(行首直接接行尾)。

word$:匹配以word结尾的行。

.

匹配除换行符

之外的任意单个字符

go.d:匹配go、任意1字符、d(如godgoXdgo1d)。

g..d:匹配g后跟任意2字符再跟d(如goodg9#d)。

*

匹配前一个字符的0次或多次重复

goo*d:匹配g后跟0个或多个o,最后是d(如gdgodgooood)。

go.*d:匹配g后跟任意字符(包括无)0次或多次,最后是d

``

转义字符,用于取消特殊字符的元字符含义(如让.匹配真正的点号)。

\.:匹配文本中的实际点号(如example.com中的.)。
\$:匹配文本中的$符号。

n\.:匹配n.(如n.1)。

注意​:在BRE(如默认grep/sed)中,元字符如{}+?|需通过\`转义才具有特殊含义;而在ERE(如egrep/grep -E/awk`)中,这些元字符通常无需转义。


2. 字符集合匹配(指定字符范围内的选择)

用于匹配一组字符中的任意一个,或排除某些字符。

元字符

含义

用法示例

匹配示例

[list]

匹配方括号内列出的任意一个字符​(字符列表)。

go[ola]d:匹配g+任意一个o/l/a+d(如godgol dgoa d)。
[a-z]:匹配任意小写字母。
[0-9]:匹配任意数字(0-9)。

[abc]:匹配abc
[A-Z0-9]:匹配任意大写字母或数字。

[^list]

匹配不在方括号内的任意一个字符(取反集合)。

[^0-9]:匹配非数字字符(如字母、符号)。
[^a-z]:匹配非小写字母。

[^A-Z]:匹配非大写字母的任意字符。

示例​:

  • [0-9]{3}:匹配连续3个数字(如123)。

  • [^ ]:匹配非空格的任意字符(如字母、符号)。


3. 次数匹配(控制前一个字符的重复次数)

用于精确控制某个字符或字符集合的重复次数范围。

元字符

含义

用法示例

匹配示例

\{n\}

匹配前一个字符恰好n次​(BRE需转义,ERE可直接用{n})。

go\{2\}d(BRE)或go{2}d(ERE):匹配g后跟2个o,最后是d(如gooood)。

a\{3\}(BRE):匹配aaa

\{n,\}

匹配前一个字符至少n次​(BRE需转义,ERE可直接用{n,})。

go\{2,\}d(BRE)或go{2,}d(ERE):匹配g后跟至少2个o,最后是d(如goodgooood)。

[0-9]\{3,\}:匹配至少3位数字。

\{n,m\}

匹配前一个字符n到m次​(BRE需转义,ERE可直接用{n,m})。

go\{2,3\}d(BRE)或go{2,3}d(ERE):匹配g后跟2-3个o,最后是d(如goodgooood)。

[a-z]\{2,4\}:匹配2-4个小写字母。

关键区别​:

  • 在BRE(如默认grep/sed)中,{}是普通字符,需转义为\{\}才能表示次数匹配。

  • 在ERE(如egrep/grep -E/awk)中,直接使用{n}{n,}等无需转义。

示例对比​:

  • BRE命令:grep "go\{2\}d" file(匹配gooood)。

  • ERE命令:egrep "go{2}d" filegrep -E "go{2}d" file(效果相同,无需转义)。


4. 扩展正则表达式特有元字符(仅ERE支持)

扩展正则表达式在BRE基础上增加了更灵活的操作符,简化了复杂模式的编写。

元字符

含义

用法示例

匹配示例

+

匹配前一个字符1次或多次​(至少1次,相当于\{1,\})。

go+d:匹配g后跟1个或多个o,最后是d(如godgoodgoood)。

a+:匹配1个或多个a(如aaa)。

?

匹配前一个字符0次或1次​(最多1次,相当于\{0,1\})。

go?d:匹配g后跟0个或1个o,最后是d(如gdgod)。

e?:匹配无e或有1个e

()

将括号内的内容视为一个整体​(用于分组操作,如重复、逻辑或)。

g(oo)+d:匹配g后跟1组或多组oo,最后是d(如good(1组oo)、gooood(2组oo))。

(ab)+:匹配ababab等。

`

`

逻辑“或”匹配(匹配多个模式中的任意一个,类似“或”关系)。

g(oo\|la)d:匹配g后跟oo(即good)或la(即glad)。

注意​:()|在BRE中无效(除非使用\(\)\|转义),仅在ERE中直接支持。


三、正则表达式核心元字符速查表

类别

元字符

功能

是否需要转义(BRE)​

ERE中是否转义

位置匹配

^

行首

$

行尾

单字符匹配

.

任意单个字符(除`

`)

``

转义特殊字符

是(需转义其他元字符)

是(按需转义)

字符集合

[list]

匹配列表中的任意一个字符

[^list]

匹配不在列表中的任意一个字符

次数匹配

*

前一个字符0次或多次

\{n\}

前一个字符恰好n次(BRE)

是(需加``)

否(直接{n}

\{n,\}

前一个字符至少n次(BRE)

是(需加``)

否(直接{n,}

\{n,m\}

前一个字符n到m次(BRE)

是(需加``)

否(直接{n,m}

{n}(ERE)

前一个字符恰好n次(ERE)

否(ERE无需转义)

扩展功能

+(ERE)

前一个字符1次或多次

否(仅ERE支持)

?(ERE)

前一个字符0次或1次

否(仅ERE支持)

()(ERE)

分组(整体操作)

否(仅ERE支持)

`

`(ERE)

逻辑“或”匹配

否(仅ERE支持)


四、正则表达式实战案例

案例1:电话号码匹配(BRE)

需求​:匹配区号025开头的电话号码,要求:

  • 号码与区号间分隔符为空格、-或无分隔

  • 号码本身必须是5或8开头,且为8位数字

正则表达式​:^(025)[ -]?[58][0-9]{7}$

分解说明​:

  • ^:匹配行首;

  • (025):匹配固定区号025(分组非必须,但提高可读性);

  • [ -]?:匹配分隔符(空格或-),?表示该分隔符出现0次或1次(即可以没有分隔符);

  • [58]:匹配号码首数字为58

  • [0-9]{7}:匹配后续7位数字(共8位);

  • $:匹配行尾。

测试数据(phone.txt)​​:

02588888888
025-5555555555
025 12345678
025 54321678
025ABC88888
025-85432109
028-85643210
0251-52765421

匹配命令​:

egrep "^(025)[ -]?[58][0-9]{7}$" phone.txt

预期输出​:

02588888888
025 54321678
025-85432109

案例2:电子邮箱匹配(ERE)

需求​:匹配符合标准格式的邮箱(用户名@子域名.二级域名.顶级域),要求:

  • 用户名:6-18位,以字母或下划线开头,允许字母、数字、部分符号(不含@和空格);

  • 子域名与二级域名:允许字母、数字、-_.

  • 顶级域:2-5位字母。

正则表达式​:^([a-zA-Z_][^@ ]{5,17})@[a-zA-Z0-9_\-.]+(\.[a-zA-Z0-9_\-.]+)?\.([a-zA-Z]{2,5})$

分解说明​:

  • ^:行首;

  • ([a-zA-Z_][^@ ]{5,17}):用户名部分:

    • [a-zA-Z_]:首字符为字母或下划线;

    • [^@ ]{5,17}:后续5-17位为非@、非空格的任意字符(总长度6-18位);

  • @:固定符号;

  • [a-zA-Z0-9_\-.]+:子域名/二级域名(允许字母、数字、_-.,至少1个字符);

  • (\.[a-zA-Z0-9_\-.]+)?:可选的二级域名(以.开头,后接合法字符,?表示0或1次);

  • \.([a-zA-Z]{2,5}):顶级域(以.开头,后接2-5位字母);

  • $:行尾。

测试数据(email.txt)​​:

zhangsan123@qq.com
li si@163.com
wang@wu@sina.com
zhao liu@126.com
qianqi@sina.com.cn

匹配命令​:

egrep "^([a-zA-Z_][^@ ]{5,17})@[a-zA-Z0-9_\-.]+(\.[a-zA-Z0-9_\-.]+)?\.([a-zA-Z]{2,5})$" email.txt

预期输出​:

zhangsan123@qq.com
qianqi@sina.com.cn

五、文本处理工具详解

1. sed流编辑器(Stream Editor)

(1)核心概念

sed是一种非交互式流编辑器,它逐行读取输入文本(文件或管道),根据预定义的规则(命令)对每行内容进行编辑(如删除、替换、插入),并将结果输出到屏幕或文件。​默认情况下,sed不会修改原文件​(除非使用-i选项)。

工作流程​:

  1. 读取​:从输入源(文件/标准输入)读取一行内容,存入模式空间(临时缓冲区);

  2. 执行​:在模式空间中按顺序执行所有sed命令(若指定行地址,则只对该行或行范围执行);

  3. 显示​:将处理后的模式空间内容输出到结果流(默认输出到屏幕),然后清空模式空间;

  4. 循环​:重复上述步骤,直到处理完所有输入行。

特点​:适合批量处理文本(如日志清洗、配置文件修改),尤其擅长基于行或模式的简单编辑操作。


(2)常用命令格式
sed [选项] '操作命令' 文件1 文件2...  
# 常用选项:
# -n:禁止默认输出(仅显示显式指定的内容,需配合p命令使用)
# -i:直接修改原文件(谨慎使用!建议先备份)
# -r 或 -E:支持扩展正则表达式(-r为旧版,-E为新版推荐)
# -e:指定多个操作命令(单命令时可省略)

(3)常用操作与示例

操作

功能

示例命令

详细说明

p

打印当前模式空间的内容

sed -n 'p' file(打印文件所有行)
sed -n '3p' file(打印第3行)

需配合-n选项避免重复输出默认内容。

d

删除当前行

sed '3d' file(删除第3行)
sed '/^$/d' file(删除所有空行)

直接移除匹配的行,不进入输出流。

s

替换字符

sed 's/old/new/' file(替换每行第一个oldnew
sed 's/old/new/g' file(替换所有old

g表示全局替换(一行内所有匹配项)。

a

在当前行后追加内容

sed '3a 新增内容' file(在第3行后插入一行新内容)

追加的文本会作为新行出现在指定行之后。

i

在当前行前插入内容

sed '3i 插入内容' file(在第3行前插入一行新内容)

插入的文本会作为新行出现在指定行之前。

=

打印当前行号

sed -n '=' file(打印文件每行的行号)

仅输出行号,不输出行内容。

n

读取下一行

sed -n 'n;p' file(打印奇数行:读取下一行并打印)

n命令会让sed跳过当前行的后续操作,直接处理下一行。


(4)寻址方式(指定操作的目标行)

sed支持通过行号正则表达式指定需要操作的行范围。

寻址方式

示例命令

说明

单行行号

sed -n '5p' file(打印第5行)

精确操作某一行。

最后一行

sed -n '$p' file(打印最后一行)

$表示文件的最后一行。

行范围

sed -n '1,3p' file(打印第1-3行)
sed -n '3,$p' file(打印第3行到末尾)

操作从起始行到结束行的所有行。

相对行范围

sed -n '1,+3p' file(打印第1行及其后3行,即1-4行)

从指定行开始,连续操作后续N行。

正则匹配行

sed -n '/关键词/p' file(打印包含“关键词”的行)

操作所有匹配正则表达式的行。

组合条件

sed -n '2,/nobody/p' file(打印第2行到第一个包含“nobody”的行)

从指定行开始,到匹配某个模式的行结束。


(5)高级操作示例
  • 删除空行​:

    sed '/^$/d' file.txt  # 删除所有空白行(行内容为空)
  • 注释特定行​(如给以root开头的行添加#注释):

    sed '/^root/ s/^/#/' /etc/passwd  # 将/etc/passwd中以root开头的行首添加#
  • 直接修改文件​(谨慎使用!):

    sed -i 's/old/new/g' file.txt  # 将文件中所有old替换为new,并直接保存到原文件
  • 复杂替换(保留匹配内容)​​:

    sed -n 's/\/bin\/bash/\/bin\/csh/p' /etc/passwd  # 将/bin/bash替换为/bin/csh,并打印修改的行
    # 使用\转义/,或改用其他分隔符(如|)避免冲突:
    sed -n 's|/bin/bash|/bin/csh|p' /etc/passwd

2. awk文本分析工具(Pattern-Scan Processing Language)

(1)核心概念

awk是一种面向字段的文本处理工具,它逐行读取输入文本,默认以空格或Tab键为分隔符将每行拆分为多个字段(1,2, ..., $NF),并通过模式(条件)+ 操作(命令)​的方式对符合条件的行进行灵活处理。awk更适合处理结构化数据(如日志、CSV文件),支持复杂的逻辑判断、数学运算和循环控制。

特点​:擅长按字段提取、统计和分析文本(如计算平均值、筛选特定条件的行、格式化输出)。


(2)基本语法
awk [选项] '模式或条件 {操作语句}' 文件1 文件2...  
# 常用选项:
# -F:指定字段分隔符(如-F: 表示以冒号为分隔符)

执行流程​:

  1. 逐行读取输入文本;

  2. 根据指定的分隔符(默认空格/TAB)将当前行拆分为多个字段(1,2,...NF,0表示整行);

  3. 若未指定模式,则对所有行执行操作;若指定了模式(如/关键词/NR>10),则仅对匹配模式的行执行操作;

  4. 在操作语句中,可通过内置变量(如$1、NF、NR)访问字段和行信息,并执行打印、计算等操作。


(3)常用内置变量

变量

含义

示例

$0

当前行的完整内容

awk '{print $0}' file(打印所有行)

$1~$n

当前行的第1~n个字段

awk -F: '{print $1}' /etc/passwd(打印每行第一个字段,如用户名)

NF

当前行的字段总数

awk '{print NF}' file(打印每行的字段数)

NR

当前处理的行号(从1开始)

awk '{print NR}' file(打印每行的行号)

FS

输入字段分隔符(同-F选项)

awk 'BEGIN{FS=":"} {print $1}' file

OFS

输出字段分隔符(默认空格)

`awk '{OFS="


(4)常用操作与示例

场景

命令示例

详细说明

打印所有内容

awk '{print}' fileawk '{print $0}' file

打印文件的每一行($0表示整行内容)。

打印指定行

awk 'NR==1 {print}' file(第1行)
awk 'NR==3 {print}' file(第3行)

通过行号(NR)精确控制要输出的行。

打印行范围

awk 'NR>=1 && NR<=3 {print}' file(1-3行)
awk '1,3 {print}' file

操作从第1行到第3行的所有内容。

打印奇数行/偶数行

奇数行:awk '(NR%2)==1 {print}' file
偶数行:awk '(NR%2)==0 {print}' file

通过取模运算(NR%2)判断行号的奇偶性。

按字段筛选

awk -F: '$3<5 {print $1,$3}' /etc/passwd(UID小于5的用户)

条件判断字段值(如第3字段UID),并输出指定字段。

统计匹配行数

awk '/\/bin\/bash$/{x++} END {print x}' /etc/passwd(统计bash用户数)

BEGIN块初始化变量,END块输出最终结果。

格式化输出

awk -F: '{print "用户名:" $1 ",UID:" $3}' /etc/passwd

自定义输出格式(结合字符串拼接)。

多分隔符支持

awk -F'[ ,:]' '{print $1}' file(以空格、逗号、冒号为分隔符)

方括号内指定多个分隔符(逻辑“或”关系)。


(5)高级功能
  • 调用Shell命令​:通过管道将字段传递给外部命令(如统计在线用户数):

    awk 'BEGIN{n=0; while("w" | getline) n++; print n-2}'  # 统计当前登录用户数(扣除标题和空行)
  • 数学运算​:计算某列的平均值(如第一列数字的平均值):

    awk '{sum+=$1; count++} END {print sum/count}' data.txt  # sum累加第一列,count统计行数
  • 数组统计​:统计每行首字段的出现次数并排序:

    awk '{a[$1]++} END {for(i in a) print a[i],i}' test.txt  # 统计每个首字段的出现次数
    awk '{a[$1]++} END {for(i in a) print a[i],i}' test.txt | sort -r  # 按次数降序排序
  • 条件判断与三元运算符​:

    awk -F: '{max=($3>$4)?$3:$4; print max}' /etc/passwd  # 取第3字段和第4字段的最大值
  • 内置函数​:如length($0)(计算行长度)、tolower($1)(转小写)、substr($1,2,3)(截取子串)。


六、总结对比

工具

核心定位

主要功能

正则表达式支持

典型使用场景

grep

快速文本搜索与过滤

根据模式匹配查找包含特定内容的行(支持过滤日志、查找关键字)

BRE(默认)、ERE(-E

日志分析、关键词查找、空行/注释过滤

sed

流式文本编辑

对文本行进行删除、替换、插入等操作(适合批量修改配置文件、清理日志)

BRE(默认)、ERE(-r/-E

配置文件修改、行内容替换、注释处理

awk

结构化文本分析与处理

按字段拆分文本,支持条件判断、数学运算、复杂逻辑(适合数据统计、报表生成)

ERE(默认支持高级正则)

日志统计、字段提取、数据格式化

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

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

相关文章

使用 Spring AI Alibaba Graph 实现工作流

1 依赖<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-alibaba-starter-dashscope</artifactId><version>1.0.0.2</version> </dependency><dependency><groupId>com.alibaba.cloud.…

碰一碰系统源码于小程序打通技术开发整合方案,驱动AI技术开发源代码

碰一碰系统结合小程序开发数据互通&#xff0c;驱动AI技术开发源代码碰一碰系统作为门店获客技术落地的核心载体&#xff0c;已从标准化产品向实体店定制演进。本文从源码d的形式出发&#xff0c;解析企业级数字人分身系统的交互系统&#xff0c;为技术团队提供可落地的开发指南…

深度学习——自然语言处理NLP

自然语言处理中的词向量技术演进与实践一、传统统计语言模型的困境与突破1.1 统计语言模型的局限性早期NLP主要依赖统计语言模型&#xff0c;如n-gram模型&#xff0c;通过统计词序列的频率来预测语言概率。这类模型存在两个根本缺陷&#xff1a;早期统计语言模型的局限性1. 维…

uni-app头像叠加显示

展示代码<view class"bmBox"><view class"bmLeft">已报名&#xff1a;<text class"blueColor">10人</text></view><view class"bmRight dflex"><view class"avatarList"><ima…

私有化部署Ragflow的预训练模型

部署ragflow代码库中的det.onnx模型&#xff08;通常是目标检测或文档结构解析类模型&#xff0c;如版面分析模型&#xff09;到火山云&#xff0c;需基于ONNX Runtime推理框架&#xff0c;结合火山云的计算资源和服务能力实现。以下是具体步骤&#xff1a; 一、模型特性与依赖…

go中的singleflight是如何实现的?

大家周四快乐&#xff0c;今天分享粉丝投稿的面经。 内容整理如下&#xff1a;go go singleflight 的底层实现 singleflight 是 Go 语言标准库中的一个很有用的包&#xff0c;它主要用来处理并发请求时的重复问题。比如在高并发场景下&#xff0c;如果多个请求同时访问同一个资…

【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读

开关电源之整流电路1. 什么是半波整流电路&#xff1f;1.1 电路结构与工作原理1.2 输出特性分析2. 全波整流电路如何工作&#xff1f;2.1 电路结构特点2.2 工作过程分析2.3 优缺点对比3. 桥式整流电路有什么优势&#xff1f;3.1 电路组成3.2 工作原理详解3.3 性能特点4. 什么是…

创建GLFW窗口,开启OpenGL之路

前言&#xff1a;本系列文章主要是一个学习笔记和总结&#xff0c;具体学习过程参考https://learnopengl-cn.github.io/这个网站的是学习OpenGL的一个很完美的新手教程。在这个部分系列中&#xff0c;我会以自己的理解详细描述每个函数、方法的使用&#xff0c;以及关键参数的解…

es通过分片迁移迁移解决磁盘不均匀问题

POST _cluster/reroute {"commands": [{"move": {"index": "xxx_detail","shard": 2,"from_node": "el8P9Ul","to_node": "4sDv-RD"}}] }查看迁移进程 GET _cat/shards?v查看磁盘…

c++打包pyd文件给Python使用调用函数

c打包pyd文件给Python使用调用函数C语言源码&#xff1a;simplemath.cpp代码&#xff1a;// // Created by ASFOR on 2025/9/11. // #include <pybind11/pybind11.h>namespace py pybind11;// 一个简单的加法函数 int add(int a, int b) {return a b; }// 一个简单的乘…

hadoop的api操作对象存储

一、获取文件或目录1. 获取某个目录下的文件// 必须的依赖 import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, LocatedFileStatus, Path, RemoteIterator}// 获取某个目录下的文件路径 def list_file(conf: Configuration, dir_path: Str…

《UE5_C++多人TPS完整教程》学习笔记52 ——《P53 FABRIK 算法(FABRIK IK)》

本文为B站系列教学视频 《UE5_C多人TPS完整教程》 —— 《P53 FABRIK 算法&#xff08;FABRIK IK&#xff09; 的学习笔记&#xff0c;该系列教学视频为计算机工程师、程序员、游戏开发者、作家&#xff08;Engineer, Programmer, Game Developer, Author&#xff09; Stephen …

HttpServletRequest vs ServletContext 全面解析

HttpServletRequest vs ServletContext 全面解析 一、 核心区别概览特性HttpServletRequest (请求对象)ServletContext (Servlet上下文/应用对象)作用域请求范围应用范围生命周期从客户端发出请求开始&#xff0c;到服务器返回响应结束。从Web应用启动&#xff08;部署&#xf…

Java后端工程师如何学AI

Java后端工程师如何学AI 目录 前言为什么Java后端工程师要学习AIAI学习路径规划基础知识体系实践项目建议学习资源推荐学习时间规划常见问题与解决方案职业发展建议总结 前言 随着人工智能技术的快速发展&#xff0c;AI已经不再是计算机科学专业的专属领域。作为Java后端工…

Django REST Framework 中 @action 装饰器详解

概述 action 装饰器是 Django REST Framework (DRF) 中 ViewSet 的一个核心功能&#xff0c;用于定义自定义路由方法。它允许开发者在标准的 CRUD 操作&#xff08;list、create、retrieve、update、destroy&#xff09;之外&#xff0c;创建符合特定业务需求的接口&#xff0c…

【重磅更新】RetroBoard 全面升级,让敏捷回顾更高效、更安全、更贴心!

​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​ ​​​​​​​…

中州养老:华为云设备管理接口开发全流程

需求分析点击同步数据时,要把华为云的数据拉取到我们的系统中对于新增设备操作,实际上这些参数与华为云产品我们添加设备时的参数是一样的表结构设计E-R图数据库字段接口分析对于设备中的数据,我们既要再IOT平台存储,又要在数据库中存储.之所以保存两份数据的原因:IOT平台中只是…

Llama-Factory微调Qwen2.5-VL从数据集制作到部署记录

Llama-Factory微调Qwen2.5-VL从数据集制作到部署记录 电脑环境配置&#xff1a; 1.ubuntu24 2.3090(24G) 3.Cuda12.9 一、数据集制作 我的数据集主要是对图像内容进行描述 1.Label-studio制作数据集 这是最原始的从零开始制作数据集的方法&#xff0c;不建议这样做&#xff01;…

【蓝桥杯真题67】C++数位和为偶数的数 第十五届蓝桥杯青少年创意编程大赛 算法思维 C++编程选拔赛真题解

C++数位和为偶数的数 第十五届蓝桥杯青少年创意编程大赛C++选拔赛真题 博主推荐 所有考级比赛学习相关资料合集【推荐收藏】 1、C++专栏 电子学会C++一级历年真题解析 电子学会C++二级历年真题解析

【计算机网络 | 第11篇】宽带接入技术及其发展历程

文章目录宽带接入技术详解数字传输系统技术演进早期电话网的传输技术演变数字传输系统技术演进&#xff1a;从碎片到统一宽带接入技术 ADSLADSL的基本原理与非对称特性DMT调制技术&#xff1a;多子信道并行传输ADSL接入网组成电话分离器的设计原理与优势ADSL的升级&#xff1a;…