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
英文地址,請注明出處:http://en.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;…