正则表达式与文本三剑客(grep、sed、awk)基础与实践

正则表达式基础与实践

一、正则表达式概述

1. 定义

正则表达式(Regular Expression,简称 RE)是用于描述字符排列和匹配模式的语法规则,核心作用是对字符串进行分割、匹配、查找、替换操作。它本质是 “模式模板”,Linux 工具(如 grep、egrep、awk)可通过该模板过滤文本数据流,最终输出 “匹配的数据” 或 “滤掉的数据”。

2. 应用场景

  • 判断字符串是否符合特定格式(如手机号、邮箱、日期);
  • 从大量文本中提取目标内容(如日志中的 IP 地址、错误信息);
  • 批量替换文本中的指定字符或格式。

3. 组成结构

正则表达式由 普通字符元字符 组成:

  • 普通字符:大小写字母(A-Z、a-z)、数字(0-9)、标点符号(!、@、# 等)及其他常规符号,仅匹配自身;
  • 元字符:具有特殊意义的专用字符,用于规定前导字符的出现模式(如匹配开头、结尾、重复次数等)。

二、基础正则表达式(BRE)

基础正则表达式是正则的核心语法,适用于 grep、sed 等工具,以下是常用元字符及示例:

元字符

功能说明

示例

示例说明

\

转义字符,取消后续特殊符号的含义

\!、\$、\n

匹配 !、$、换行符 \n

^

匹配字符串的开始位置

^a、^the、^#

匹配以 a、the、# 开头的行

$

匹配字符串的结束位置

word$、^$

匹配以 word 结尾的行;^$ 匹配空行

.

匹配除换行符 \n 以外的任意一个字符

lo.k、l..k

匹配 lok(o 和 k 间 1 个任意字符)、lbck(l 和 k 间 2 个任意字符)

*

匹配前面一个字符出现0 次或多次(可重复任意次,包括不出现)

loo*k、lo*k

loo*k 匹配 lk(0 个 o)、lok(1 个 o)、look(2 个 o)等;lo*k 同理

[list]

匹配 list 列表中的任意一个字符(列表可是字符集、范围)

go[ola]d、[a-z]、[0-9]

go[ola]d 匹配 gold、goal、god;[0-9] 匹配任意 1 位数字

[^list]

匹配 list 列表中的任意一个字符(取反)

[^0-9]、[^a-z]

[^0-9] 匹配非数字字符;[^a-z] 匹配非小写字母

\{n\}

匹配前面一个字符恰好 n 次(grep 需加 \,egrep/awk 无需加)

lo\{2\}k、[0-9]\{2\}

lo\{2\}k 匹配 look(o 出现 2 次);[0-9]\{2\} 匹配任意 2 位数字

\{n,\}

匹配前面一个字符不少于 n 次(≥n 次)

lo\{2,\}k、[0-9]\{2,\}

lo\{2,\}k 匹配 look(2 次 o)、loook(3 次 o)等;[0-9]\{2,\} 匹配 2 位及以上数字

\{n,m\}

匹配前面一个字符n 到 m 次(≥n 且 ≤m 次)

lo\{2,3\}k、[0-9]\{2,3\}

lo\{2,3\}k 匹配 look(2 次 o)、loook(3 次 o);[0-9]\{2,3\} 匹配 2-3 位数字

基础正则实践(基于 a.txt 文本)

1. 准备测试文本 a.txt

先创建文本文件,内容如下:

lkloklookloooklooooookloooooaaaklooooooookabbbbcdabbbbcd666ooooloooookoooooolkaoblck
2. 实践案例(grep 命令)

命令

匹配逻辑

输出结果(a.txt 中匹配的行)

grep "loo*k" a.txt

匹配 l 后接任意次 o(0 次及以上),再接 k

lok、look、loook、looooook、looooooook、ooooloooook

grep "lo.k" a.txt

匹配 l 后接 o、1 个任意字符,再接 k

look(o 和 k 间是 o,符合 “1 个任意字符”)

grep "lo.*k" a.txt

匹配 l 后接 o、任意个任意字符(0 次及以上),再接 k

lok、look、loook、looooook、loooooaaak、looooooook、ooooloooook(o 和 k 间可含字母如 aaa)

grep "lo\{2\}k" a.txt

匹配 l 后接 2 次 o,再接 k

look

grep "lo\{2,\}k" a.txt

匹配 l 后接≥2 次 o,再接 k

look、loook、looooook、looooooook、ooooloooook

grep "lo\{2,3\}k" a.txt

匹配 l 后接 2-3 次 o,再接 k

look(2 次 o)、loook(3 次 o)

grep "^a" a.txt

匹配以 a 开头的行

abbbbcd、abbbbcd666、aoblck

grep "6$" a.txt

匹配以 6 结尾的行

abbbbcd666

三、扩展正则表达式(ERE)

扩展正则表达式在基础正则上新增了元字符,功能更灵活,适用于 egrep(grep -E)、awk 等工具(无需对 {}、+ 等元字符转义,grep 需加 \ 转义)。

元字符

功能说明

示例

示例说明

+

匹配前面一个字符出现1 次及以上(至少出现 1 次,区别于 * 的 “0 次及以上”)

lo+k

匹配 lok(1 次 o)、look(2 次 o)、loook(3 次 o)等,不匹配 lk(0 次 o)

?

匹配前面一个字符出现0 次或 1 次(最多出现 1 次)

lo?k

匹配 lk(0 次 o)、lok(1 次 o),不匹配 look(2 次 o)

()

将括号中的字符串作为一个整体(分组),用于批量匹配或重复

l(oo)+k

把 oo 视为整体,匹配 look(1 次 oo)、looook(2 次 oo)等

`

`

逻辑 “或”,匹配 `

` 两侧任意一个表达式

{n}

同基础正则 \{n\},匹配前面字符恰好 n 次(无需转义)

lo{3}k

匹配 loook(o 出现 3 次)

{n,}

同基础正则 \{n,\},匹配前面字符≥n 次(无需转义)

lo{3,}k

匹配 loook(3 次 o)、looooook(5 次 o)等

{n,m}

同基础正则 \{n,m\},匹配前面字符 n-m 次(无需转义)

lo{3,5}k

匹配 loook(3 次 o)、looooook(5 次 o),不匹配 looooooook(6 次 o)

扩展正则实践(基于 a.txt 文本)

使用 egrep 命令(支持扩展正则,无需转义),实践案例如下:

命令

匹配逻辑

输出结果(a.txt 中匹配的行)

egrep "lo+k" a.txt

匹配 l 后接≥1 次 o,再接 k

lok、look、loook、looooook、looooooook、ooooloooook

egrep "lo?k" a.txt

匹配 l 后接 0-1 次 o,再接 k

lk(0 次 o)、lok(1 次 o)、oooooolk(ooooo 后接 o?,即 0-1 次 o,最终匹配 oooooolk)

egrep "l(oo)+k" a.txt

匹配 l 后接≥1 次 oo 组,再接 k

look(1 次 oo)、looooook(2 次 oo)、looooooook(3 次 oo)、ooooloooook(含 oo 组)

`egrep "(oo

ab)" a.txt`

匹配含 oo 或 ab 的行

egrep "lo{3}k" a.txt

匹配 l 后接 3 次 o,再接 k

loook

egrep "lo{3,}k" a.txt

匹配 l 后接≥3 次 o,再接 k

loook、looooook、looooooook、ooooloooook

egrep "lo{3,5}k" a.txt

匹配 l 后接 3-5 次 o,再接 k

loook(3 次 o)、ooooloooook(loooo 即 4 次 o,符合 3-5 次范围)

四、补充实践(基于 b.txt 文本)

1. 准备测试文本 b.txt

创建文本文件,内容如下:

loklo12klo1kloAkloBklookloaklodkabcd1234

2. 案例(基础 / 扩展正则结合)

命令

正则类型

匹配逻辑

输出结果(b.txt 中匹配的行)

grep "[a-zA-Z0-9]k" b.txt

基础

匹配 “字母 / 数字 + k” 的组合

lo1k、loAk、loBk、look、loak、lodk

grep "lo[ABo]k" b.txt

基础

匹配 lo 后接 A/B/o,再接 k

loAk、loBk、look

grep "lo[^a-zA-Z]k" b.txt

基础

匹配 lo 后接 “非字母”,再接 k

lo1k(lo 后是数字 1,非字母)

grep "[^a-zA-Z]" b.txt

基础

匹配含 “非字母” 的行(即含数字、符号等)

lo12k、lo1k、1234

五、工具使用说明

工具

支持的正则类型

特殊说明(元字符转义)

grep

基础正则(BRE)

使用 {n}、{n,}、{n,m} 需加转义 \(如 \{2\});扩展正则需加 -E 参数(grep -E 等价于 egrep)

egrep

扩展正则(ERE)

无需转义 {}、+、?、()、`

awk

扩展正则(ERE)

无需转义,支持所有扩展正则元字符

sed

基础正则(BRE)

使用扩展正则需加 -r 参数

Linux 文本处理三剑客(grep、sed、awk)

一、grep:文本过滤工具

grep 是 Linux 中最基础的文本过滤工具,核心功能是按 “字符串” 或 “正则表达式” 筛选文本行,仅输出匹配的内容,常用于日志分析、配置文件检索等场景。

1. 核心语法

grep [选项] "匹配规则" 目标文件

2. 常用选项与功能

选项

功能说明

示例

无选项

直接匹配包含 “字符串” 的行,输出整行内容

grep "blp5" /tmp/services(输出含 “blp5” 的行)

-v

反向匹配:输出不包含“字符串” 的行

grep -v "udp" /tmp/services(输出不含 “udp” 的行)

-i

忽略大小写:匹配时不区分字母大小写

grep -i "BLP5" /tmp/services(同时匹配 “blp5”“BLP5” 等)

-o

仅显示匹配部分:不输出整行,只打印匹配的字符串

grep -o "48[0-9]\+" /tmp/services(仅输出以 “48” 开头的数字)

-n

显示行号:输出匹配行的行号及内容

grep -n "tcp" /tmp/services(输出含 “tcp” 的行号 + 内容)

-E

支持扩展正则表达式(等价于 egrep)

grep -E "lo{2,3}k" a.txt(匹配 “look”“loook”)

3. 常用匹配规则(结合正则)

匹配规则

功能

示例

^字符串

匹配以 “字符串” 开头的行

grep "^blp5" /tmp/services(输出以 “blp5” 开头的行)

字符串$

匹配以 “字符串” 结尾的行

grep "6$" a.txt(输出以 “6” 结尾的行)

^$

匹配空行

grep -v "^$" /etc/httpd/conf/httpd.conf(过滤配置文件空行)

[字符集]

匹配字符集中的任意一个字符

grep "lo[ABo]k" b.txt(匹配 “loAk”“loBk”“look”)

[^字符集]

匹配字符集中的任意一个字符

grep "lo[^a-z]k" b.txt(匹配 “lo1k”,不匹配 “loak”)

4. 典型场景示例

  • 过滤 Apache 配置文件注释行和空行:
grep -v "^#" /etc/httpd/conf/httpd.conf | grep -v "^$"
  • 从日志中提取 IP 地址(假设日志含 “192.168.x.x” 格式 IP):
grep -o "192\.168\.[0-9]\+\.[0-9]\+" /var/log/access.log

二、sed:流编辑器(文本修改工具)

sed(Stream Editor)是 “流编辑器”,核心功能是按规则逐行处理文本(修改、删除、添加、替换),处理时不直接修改原文件(需 -i 选项),常用于批量修改配置、文本格式化等场景。

sed 的核心逻辑:将文本行逐行读入 “模式空间”(临时缓冲区),按命令处理后输出,再处理下一行,直到文件结束。

1. 核心语法

sed [选项] "地址范围 命令" 目标文件
创建文本文件,内容如下:

cat /tmp/services

nimgtw 		48003/udp 		# Nimbus Gateway
3gpp-cbsp 		48049/t//cp 		# 3GPP Cell Broadcast Service Protocol
isnetserv 		48128/tcp 		# Image Systems Network Services
isnetserv 		48128/udp 		# Image Systems Network Services
blp5 			48129/tcp 		# Bloomberg locator
blp5 			48129/udp 		# Bloomberg locator
com-bardac-dw 	48556/tcp 		# com-bardac-dw
com-bardac-dw 	48556/udp 		# com-bardac-dw
iqobject 		48619/tcp 		# iqobject
iqobject 		48619/udp 		# iqobject

2. 常用选项

选项

功能说明

示例

-n

不打印模式空间:仅输出被命令处理后的行(需配合 p 命令)

sed -n "1,3p" /tmp/services(仅输出 1-3 行)

-i

直接修改原文件:无需重定向,直接覆盖原文件内容(慎用!)

sed -i "s/blp5/test/g" /tmp/services(将原文件中 “blp5” 替换为 “test”)

-e

执行多个命令:一次处理中执行多个 sed 命令

sed -e "1,4d" -e "s/blp5/test/" /tmp/services(先删 1-4 行,再替换字符串)

-f

从文件读取命令:将 sed 命令写入文件,通过 -f 调用

sed -f sed_commands.txt /tmp/services(sed_commands.txt 中存 sed 命令)

-r

支持扩展正则表达式:无需对 {} + 等元字符转义

sed -r "s/(lo{2})k/\1_test/" a.txt(匹配 “look” 并替换为 “loo_test”)

3. 关键概念:地址范围(指定处理哪些行)

sed 通过 “地址范围” 限定命令作用的行,常见格式如下:

地址范围格式

功能

示例

数字

仅处理第 N 行

sed "5d" /tmp/services(删除第 5 行)

数字1,数字2

处理第 N1 行到第 N2 行

sed "1,3p" /tmp/services(打印 1-3 行)

数字,+$N

从第 N 行开始,向后 N 行

sed "/blp5/,+1p" /tmp/services(打印 “blp5” 行及后 1 行)

数字~步长

从第 N 行开始,每 “步长” 行处理一次

sed "1~2d" /tmp/services(删除奇数行,步长 = 2)

/正则/

处理匹配 “正则” 的行

sed "/^blp5/d" /tmp/services(删除以 “blp5” 开头的行)

/正则1/,/正则2/

处理 “正则 1” 匹配行到 “正则 2” 匹配行

sed "/^blp5/,/^com/p" /tmp/services(打印 “blp5” 到 “com” 开头的行)

$

处理最后一行

sed "$d" /tmp/services(删除最后一行)

4. 常用 sed 命令(处理文本的核心操作)

命令

功能

示例

p

打印:输出模式空间中的行(需配合 -n)

sed -n "1~2p" /tmp/services(打印奇数行)

d

删除:删除模式空间中的行,不输出

sed "/udp/d" /tmp/services(删除含 “udp” 的行)

s/旧值/新值/[选项]

替换:将 “旧值” 替换为 “新值”,默认仅替换每行第一个匹配

- s/blp5/test/:替换每行第一个 “blp5” 为 “test”

- s/blp5/test/g:g(全局替换),替换每行所有 “blp5”

- s/48049/&.123/:& 引用匹配内容,将 “48049” 改为 “48049.123”

a \文本

追加:在匹配行下方添加 “文本”

sed "/blp5/a \new_line" /tmp/services(在 “blp5” 行下加 “new_line”)

i \文本

插入:在匹配行上方添加 “文本”

sed "/blp5/i \new_line" /tmp/services(在 “blp5” 行上加 “new_line”)

c \文本

替换行:将匹配行整体替换为 “文本”

sed "/blp5/c \replace_line" /tmp/services(将 “blp5” 行替换为 “replace_line”)

r 文件名

读取文件:将 “文件名” 的内容追加到匹配行下方

sed "/blp5/r a.txt" /tmp/services(在 “blp5” 行下追加 a.txt 内容)

w 文件名

写入文件:将匹配行写入 “文件名”(不影响屏幕输出)

sed "/blp5/w b.txt" /tmp/services(将 “blp5” 行保存到 b.txt)

5. 典型场景示例

  • 批量替换配置文件中的字符串(修改原文件):
sed -i "s/Listen 80/Listen 8080/g" /etc/httpd/conf/httpd.conf
  • 删除日志文件中第 10-20 行的注释(假设注释以 “#” 开头):
sed -i "10,20s/^#//" /var/log/app.log
  • 将文本中 “端口 / 协议” 格式(如 48003/udp)改为 “协议 / 端口”(如 udp/48003):
sed -r "s/(.*)([0-9]+)\/(tcp|udp)(.*)/\1\3\/\2\4/" /tmp/services

三、awk:文本处理编程语言

awk 是功能最强大的文本处理工具,兼具 “编程语言” 特性,支持字段分割、变量运算、条件判断、循环等,核心优势是 “按字段处理文本”(如表格数据、日志的字段提取),常用于数据统计、报表生成等场景。

awk 的核心逻辑:将文本逐行视为 “记录”,每行按 “分隔符” 拆分为多个 “字段”(默认分隔符为空格 / 制表符),通过 $1 $2... 引用字段($0 表示整行)。

1. 核心语法

awk [选项] '模式 { 动作 }' 目标文件
  • 模式:指定处理哪些行(如 BEGIN END、正则、行号范围);
  • 动作:对匹配的行执行的操作(如打印字段、运算、判断)。

2. 常用选项

选项

功能说明

示例

-F 分隔符

指定字段分隔符(默认是空格 / 制表符)

awk -F ":" '{print $1,$3}' /etc/passwd(以 “:” 为分隔符,打印第 1、3 字段)

-v 变量=值

定义 awk 变量(在处理文本前赋值)

awk -v num=5 '$3 > num {print $0}' /etc/passwd(打印第 3 字段大于 5 的行)

-f 文件名

从文件读取 awk 脚本(将 “模式 + 动作” 写入文件)

awk -f script.awk /tmp/services(script.awk 中存 awk 逻辑)

--profile=[文件]

将 awk 命令格式化输出到文件(便于调试)

awk --profile=prof.txt 'BEGIN{print "test"}'(将脚本写入 prof.txt)

3. 核心模式(控制处理范围)

模式

功能

示例

BEGIN { 动作 }

处理文本执行(仅执行一次),常用于初始化变量、打印表头

awk 'BEGIN{print "Service\tPort"; print "==="}' /tmp/services(先打印表头)

END { 动作 }

处理文本执行(仅执行一次),常用于统计结果、打印表尾

awk '{count++} END{print "总行数:"count}' /tmp/services(统计文件总行数)

/正则/

处理匹配 “正则” 的行

awk '/tcp/{print $1,$2}' /tmp/services(打印含 “tcp” 的行的第 1、2 字段)

行号范围

处理指定行号的行

awk '1,3{print $0}' /tmp/services(打印 1-3 行)

条件判断

处理满足条件的行

awk '$2 ~ /48129/{print $0}' /tmp/services(第 2 字段含 “48129” 的行)

4. 常用内置变量(无需定义直接使用)

内置变量

功能

示例

$0

表示当前行的完整内容

awk '{print $0}' /tmp/services(打印整行)

$n

表示当前行的第 n 个字段(n 为数字)

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

NF

表示当前行的 “字段总数”

awk '{print "当前行字段数:"NF}' /tmp/services(输出每行的字段数)

NR

表示当前行的 “行号”(整个文件的行号)

awk 'NR>5{print NR,$0}' /tmp/services(打印行号大于 5 的行)

FS

字段分隔符(等价于 -F 选项,默认是空格)

awk 'BEGIN{FS=":"} {print $1,$3}' /etc/passwd(以 “:” 为分隔符)

OFS

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

`awk 'BEGIN{FS=":";OFS="

5. 典型场景示例

  • 统计 /etc/passwd 中 UID 大于 1000 的用户数:
awk -F ":" '$3 > 1000 {count++} END{print "普通用户数:"count}' /etc/passwd
  • 从 Apache 访问日志(假设格式为 “IP 时间 请求路径”)中提取访问最多的前 5 个 IP:
awk '{print $1}' /var/log/access.log | sort | uniq -c | sort -nr | head -5
  • 格式化输出 /tmp/services 内容(添加表头、对齐字段):
awk 'BEGIN{print "Service\t\tPort/Protocol\tDescription";print "----------------------------------------"} {printf "%-15s %-15s %s\n", $1, $2, $3}' /tmp/services

结果

Service		Port			Description
===
nimgtw 		48003/udp 	# Nimbus Gateway
3gpp-cbsp 	48049/tcp 	# 3GPP Cell Broadcast Service Protocol
isnetserv 	48128/tcp 	# Image Systems Network Services
isnetserv 	48128/udp 	# Image Systems Network Services
blp5 		48129/tcp 	# Bloomberg locator
blp5 		48129/udp 	# Bloomberg locator
com-bardac-dw 	48556/tcp 	# com-bardac-dw
com-bardac-dw 	48556/udp 	# com-bardac-dw
iqobject 	48619/tcp 	# iqobject
iqobject 	48619/udp 	# iqobject
===
END......
  • 计算文本中第 2 字段(假设是数字)的总和:
awk '{sum += $2} END{print "总和:"sum}' /tmp/services

四、三剑客功能对比与适用场景

工具

核心优势

适用场景

特点

grep

快速过滤文本行

日志检索、关键词匹配、筛选行

功能单一,仅 “过滤”,不修改内容

sed

批量修改文本

字符串替换、行删除 / 添加、格式调整

按 “行” 处理,适合简单修改,不擅长字段运算

awk

字段处理与数据统计

字段提取、数据计算、报表生成、条件判断

按 “字段” 处理,支持编程逻辑,功能最全面

总结:简单筛选用 grep,批量修改用 sed,复杂字段处理或统计用 awk,实际场景中三者常结合使用(如 grep 筛选后用 sed 修改,再用 awk 统计)。

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

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

相关文章

eclipse中web项目编译后的lib里面jar为空问题处理

1. 检查项目构建配置验证项目性质右键单击项目 → Properties确认项目已正确配置:​Project Facets​:确保已勾选"Dynamic Web Module"​Targeted Runtimes​:确保已选择服务器运行时(如Tomcat)检查部署程序…

C语言中的递归问题——汉诺塔问题

汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。传说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在…

ArkAnalyzer源码初步分析I——分析ts项目流程

1.前言: 鸿蒙程序分析框架ArkAnalyzer(方舟分析器) 源码地址 入门文档 2.阅读入门文档后: 本人具有一定的Java开发经验。虽然我对 TypeScript(TS)和 ArkTS 还不熟,但很多概念对我这个 Java 开…

c#基础二(类和对象,构造器调用顺序、访问级别、重写和多态、抽象类和接口)

一、类1.0对象初始化器class Student {public String name;public int age { get; set; } } internal class Program {static void Main(string[] args){ //写法一Student stunew Student();stu.name"Tom";stu.age20;//写法二Student stu2 new Student { name &qu…

Qt之快捷键、事件处理、自定义按键——完成记事本项目

快捷键我们电脑中的记事本中还支持快捷键,如“CTRLO”打开文件、“CTRLS”保存文件在Qt中使用QShortcut这个类创建快捷键在.cpp文件的构造函数中创建QShortcut对象,绑定打开文件和保存文件的槽函数放大缩小字体还是在.cpp的构造函数中编写代码Widget::Wi…

Open cascade中如何使用BRepAlgoAPI_Splitter分割一个Face

理论介绍 在OpenCASCADE几何建模内核中,BRepAlgoAPI_Splitter是一个强大的工具,用于将一个形状(Shape)用另一个形状(Tool)进行分割。这种操作在CAD建模中非常常见,比如用平面切割实体、用曲线分…

【医疗 AI】Baichuan-M2 医疗大模型:技术解读与使用方法

【医疗 AI】Baichuan-M2 医疗大模型:技术解读与使用方法1. Baichuan-M2 医疗大模型简介1.1 基本信息1.2 下载地址1.3 技术特点2. Baichuan-M2 模型技术报告2.1 摘要2.2 医学性能评估2.2.1 HealthBench基准2.2.2 中国医疗场景对比评估2.3 系统架构2.3.1 验证器系统2.…

unity pcd 二进制版 简单显示文件对象(单色)

unity Point Cloud Viewer and Tool 那个插件不支持pcd二进制,而且网上到处都是AI 我恨这种AI滥用,提供不了一点价值 好了,言归正传 可以在Point Cloud Viewer and Tool这个插件报错地方转用这个代码,具体咋结合请自行研究。 …

强大的开源文档问答工具-Kotaemon

Kotaemon 是一个基于 RAG(Retrieval-Augmented Generation)架构的开源文档问答工具,为用户提供与文档对话的智能交互体验。该项目同时服务于终端用户和开发者,具有高度的可扩展性和定制化能力。技术栈分析核心技术栈后端框架Pytho…

区块链:搭建简单Fabric网络并调用智能合约

使用docker服务搭建Hyperledger/fabric网络的详细教程,实现构建多节点的简单联盟链,并编写、调用智能合约实现投票业务。 目录 背景知识 Hyperledger Fabric 基本组件 交易(Transaction) 智能合约 实验目的 实验环境 基础依赖 安装Golang 安装do…

Web前端面试题(2)

Web前端面试题(附答案及解析)&#xff08;2025.9月最新版&#xff09;-CSDN博客 1.link 与 import 的区别和用法 主要区别 特性<link>import语法类型HTML标签CSS规则加载方式并行加载&#xff08;与其他资源同时加载&#xff09;串行加载&#xff08;必须等待主CSS文件…

Paxos协议

目录 Paxos 是什么&#xff08;What&#xff09; Paxos 的目的&#xff08;Why&#xff09; 角色与职责&#xff08;Who&#xff09; 基本流程&#xff08;How&#xff09; 常见问题与对策 什么是多数派&#xff08;Quorum&#xff09; Paxos vs Raft 异同点 Paxos 是什…

第十二篇:Qcom Camx打印实时帧率 FPS

一、第一种方式(有些低平台可能没有) adb shell setprop persist.vendor.camera.enableFPSLog TRUE adb shell setprop persist.vendor.camera.systemLogEnable TRUE adb shell setprop vendor.debug.camera.overrideLogLevels 0xff chi-cdk/core/chiframework/chxextensi…

TRAE通用6A规则+敏捷开发5S规则

网上研究别人的一些规则,也搞一份给大家 6A工作流项目规则 身份定义 你是一位资深的软件架构师和工程师,具备丰富的项目经验和系统思维能力。你的核心优势在于: 上下文工程专家:构建完整的任务上下文,而非简单的提示响应 规范驱动思维:将模糊需求转化为精确、可执行的规…

【Nginx开荒攻略】Nginx主配置文件结构与核心模块详解:从0到1掌握nginx.conf:

目录 引言 1 nginx.conf的整体结构 2 main全局块详解 2.1 核心指令解析 2.1.1 user&#xff1a;运行用户 2.1.2 worker_processes&#xff1a;工作进程数 2.1.3 pid&#xff1a;PID文件路径 2.1.4 worker_rlimit_nofile&#xff1a;文件描述符限制 2.2 main块配置示例…

【前端教程】从基础到优化:一个登录页面的完善过程

最近做了一个简单的登录页面,主要练习了文本框的onfocus与onblur事件的使用。虽然功能实现了,但仔细想想还有不少可以改进的地方。今天就来分享一下这个登录页面的开发过程和优化思路。 初始实现与解析 先来看一下最初的实现代码: <!DOCTYPE html> <html> &l…

独家 | 抖音生活服务调整:涂晴接管市场和达人运营,旭凯担任北部大区负责人

文/刀客doc(头条精选作者)刀客doc独家获悉&#xff0c;9月8日抖音生活服务完成新一轮组织调整&#xff0c;并已在内部all hands完成官宣。此次调整主要涉及北部大区、达人运营与市场部三大条线的人事轮换与汇报关系变更。核心变动如下&#xff1a;涂晴&#xff0c;原抖音生活服…

class_9:java 抽象类和接口

抽象类 需要用abstract 修饰类和接口abstract class Person{String address;String name;abstract public void eat();abstract public void drink();public void printInfo(){System.out.println("name " name);}} class Student extends Person{public void eat()…

【C++】队列queue的使用

语法 在 C 中&#xff0c;队列的语法如下&#xff1a; #include <queue>// 声明队列 std::queue<Type> q;这里 Type 是队列中存储元素的数据类型。 常用操作 队列提供了以下常用操作&#xff1a; empty(): 检查队列是否为空。 size(): 返回队列中的元素数量。 fron…

HTTP 协议的基本格式

目录 &#xff08;一&#xff09;HTTP是什么 &#xff08;二&#xff09;报文格式 &#xff08;1&#xff09;请求 ①首行 1.URL 2.方法&#xff08;method&#xff09; Ⅰ.GET Ⅱ.POST Ⅲ.PUT Ⅳ.DELETE 3.版本号 ②请求头&#xff08;header&#xff09; 1.键值对…