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

Linux文本处理三剑客(详解)

一、文本三剑客是什么?

1. 对于接触过Linux操作系统的人来说,应该都听过说Linux中的文本三剑客吧,即awk、grep、sed,也是必须要掌握的Linux命令之一,三者都是用来处理文本的,但侧重点各不相同,awk功能最强大,但也最复杂。

二、文本三剑客介绍 

1. grep

 特点

  • 使用正则表达式搜索文本
  • 匹配到的文本会显示出来并标红
  • 使用权限是所有用户

工作方式 

  • grep可以在一个或多个文件中检索,如果条件中包含了空格,需要使用双引号引起

工作结果

  • 如果搜索成功则返回为0的状态码 ,否则为1的状态码

格式

grep -参数 条件 文件名参数:-i		忽略大小写
-c		统计匹配的行数
-v		取反,不显示匹配的行-i	
-w		匹配单词
-E		等价于egrep,即启用扩展正则表达式
-n		显示行号
-rl		将指定目录内的文件打印
-A数字		匹配行及以下n行
-B数字		匹配行及以上n行
-c数字		匹配行及上下n行
-q		静默模式,没有任何内容输出,使用$?来判断是否执行成功
-o		只显示匹配的内容
示例
操作对象文件:/etc/passwd作用:  记录账户的信息,共分为7段,使用冒号分割
意义:  账户名:密码代号x: UID:GID: 注释:家目录:登录的Shell
注意:  最后一段/sbin/nologin表述不允许登录# 搜索/etc/passwd 含有root的字符串并显示行号
[root@server ~]# grep -n "root" /etc/passwd 
1:root:x:0:0:root:/root:/bin/bash
10:operator:x:11:0:operator:/root:/sbin/nologin# 搜索/etc/passwd 含有sshd的字符串并显示行号
[root@server ~]# grep -n "sshd" /etc/passwd 
32:sshd:x:74:74:Privilege-separated SSH:/usr/share/empty.sshd:/sbin/nologin# 匹配/bin/bash的行数,显示行号
[root@server ~]# grep  "/bin/bash" /etc/passwd  | wc -l
22# 匹配不是/sbin/nologin的行,并显示行号
[root@server ~]# grep -nv "/sbin/nologin" /etc/passwd # -n显示行号 -i忽略大小写
[root@server ~]# grep -ni "d" /etc/passwd # 匹配含有ftp行及以上3行内容
[root@server ~]# grep -nB3 "ftp" /etc/passwd
9-mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
10-operator:x:11:0:operator:/root:/sbin/nologin
11-games:x:12:100:games:/usr/games:/sbin/nologin
12:ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin

2.sed

介绍

sed命令是将一系列的编辑命令应用于批处理文本的理想工具。sed命令拥有非交互式和高效的特点,可以为用户节约大量的时间。本节将介绍sed命令的基础知识。

sed命令是一个非交互式的文本编辑器,它可以对来自文本文件以及标准输出的行进行编辑。其中,标准输出可以是来自键盘、文件重定向、字符串、变量或者是管道的文本。

sed命令会从文件或者标准输入中一次读取一行数据,将其复制到缓冲区,然后读取命令行或者脚本的编辑子命令,对缓冲区中的文本行进行编辑。重复此过程,一直到所有的文本行都处理完毕。

工作原理

  • 模式空间pattern space:sed在内存里开辟模式空间,处理文件的每个输入行,最多8192字节

  • 保留空间holding space:sed在内存里开辟保留空间,保存已经处理过的输入行,最多8192字节

原理:sed 的工作流程主要包括读取、执行和显示三个过程

  • 1.读取:sed 从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)

  • 2. 执行:默认情况下,所有的sed 命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed 命令 将会在所有的行上依次执行

  • 3.显示:发送修改后的内容到输出流。在发送数据后,模式空间将会被清空

  • 重复上述过程,直到将文件中所有数据处理完毕

基本语法

sed -参数	'[定址符]'  '[操作]'  文件名参数:
-n,--quiet,--silent:安静模式,不输出模式空间中的内容,在一般sed的用法中,所有来自STDIN的数据一般都会被列出到屏幕上,但如果加上-n参数后,则只有经过sed特殊处理的那一行才会被列出来
-i:  直接编辑原文件,而不是由屏幕输出,默认不对原文件进行操作
-e:  直接在命令行模式上进行sed的动作编辑,多个子命令之间也可以用分号隔开,如:sed -e command1; command2......filename  或者  sed -e 'command1'  -e 'command2'......filename
-r:使用扩展正则表达式F
-f:  直接将sed的动作写在一个文件内,-f filename则可以执行filename内的sed动作--help:显示帮助--version:显示版本-{}:  可组合多个命令,以分好隔开
定址符
  • 用于使用数字指定处理行区间,或者使用正则进行过滤

  • 表示方法

地址定界

作用
1,5对文件的1-5行进行处理
2,$对文件的2-最后一行进行处理
1,+3对文件第一行以及以后的第三行内容进行处理
1~2对文件的1,3,5,7,......的行进行处理
/正则表达式/对任何能够被正则表达式匹配带的行进行处理
操作
S: 替换,普换指定字符,一般搭配正则表达式
d: 删除,删除选定的行。
p: 打印,如果同时指定行,表示打印指定行:如果不指定行,则表示打印所有内容:如果有非打印字符,则以 ASCII 码输出。其通常与“-n” 选项一起使用。
=: 打印行号。
a: 增加,a的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)
i: 插入,i的后面可以接字串,而这些字串会在新的一行出现(目前的上一行)
C: 行替换,指定行中的所有内容,普换成该选项后面的字符串。
y: 字符转换,转换前后的字符长度必须相同。
l(小写):打印数据流中的文本和不可打印的ASCII字符(比如结束符$、制表符\t)
!: 对指定行以外的所有行应用命令
&: 代表匹配到的内容
详细示例
### 切记多加练习!!!
[root@server ~]# vim sed1.txt[root@server ~]# sed -n 'p' sed1.txt  #打印全文[root@server ~]# sed -n '=;p' sed1.txt # 打印全文并显示行号[root@server ~]# sed -n -e '=' -e  'p' sed1.txt [root@server ~]# sed -n 'l' sed1.txt  #打印控制字符[root@server ~]# sed -n '1p' sed1.txt  # 打印第一行[root@server ~]# sed -n '1p' sed1.txt # 不加-n会显示全部,加-n只显示处理行
[root@server ~]# 
[root@server ~]# sed -n '4,6p' sed1.txt  #打印4-6行
four
five
six[root@server ~]# sed -n '7,$p' sed1.txt # 打印7到最后一行
seven
eight
nine
ten[root@server ~]# sed -n '$p' sed1.txt #打印最后一行
ten[root@server ~]# sed -n '1~2p' sed1.txt #打印基数行
one
three
five
seven
nine[root@server ~]# sed -n '2~2p' sed1.txt  #打印偶数行
two
four
six
eight
ten
[root@server ~]# sed -n '4p;6p;8p' sed1.txt #打印4,6 8行
four
six
eight[root@server ~]# sed -n -e '4p' -e '6p' -e '8p' sed1.txt 
four
six
eight[root@server ~]# sed -n '1!p' sed1.txt #打印非第一行内容
two
three
four
five
six
seven
eight
nine
ten[root@server ~]# sed -n '1,+5p' sed1.txt  #打印第一行后的5行
one
two
three
four
five
six[root@server ~]# sed -n '/^f/p' sed1.txt  #打印f开头的行
four
five[root@server ~]# sed -n '/t/p' sed1.txt  #检索包含t的行
two
three
eight
ten[root@server ~]# sed -n '/^f/p;/t/p' sed1.txt  #检索f开头行或者包含t的行
two
three
four
five
eight
ten[root@server ~]# sed -n '2,/five/p' sed1.txt #检索第二行到five所在行
two
three
four
five[root@server ~]# sed -n '/n$/p' sed1.txt #检索n结尾的行
seven
ten[root@server ~]# sed -n 'n;p' sed1.txt #打印偶数行
two
four
six
eight
ten[root@server ~]# sed -n 'p;n' sed1.txt #打印奇数行
one
three
five
seven
nine[root@server ~]# sed -n '$=' sed1.txt #打印行数
10

文本替换

范例文件

[root@server ~]# cp /etc/passwd ~/ps
[root@server ~]# ls
公共  视频  文档  音乐  anaconda-ks.cfg  ps
模板  图片  下载  桌面  passwd           sed1.txt
格式
sed '行范围s/旧字符串/新字符串/替换标记'  处理文件名
  • 行范围:使用数字表示,即对第几行到第几行进行替换管理处理,若省略则表示进行全文处理

  • s:替换动作

  • 替换标记

1.数字: 使用1-512之间的数字,表示指定需要替换的字符串出现第几次才进行替换

2.g: 对数据中所有匹配到的内容进行替换,若省略g则只会对第一次匹配的内容进行替换

3.p:替换成功立刻打印,一般与-n一起使用D:

4.w :文件名:将缓冲区的内容写入到指定文件中

5. &: 使用正则表达式匹配的内容进行替换

6.\: 转义符,若有特殊符号或路径则需要转义

示例
# 替换root为boot
[root@server ~]# sed  's/root/boot/g' ps#将每一行的第一个root替换为admin
[root@server ~]# sed -n  's/root/admin/p' ps
admin:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin#将本行第二次出现的root进行替换admin
[root@server ~]# sed -n 's/root/admin/2p' ps
root:x:0:0:admin:/root:/bin/bash#将全文所有root进行替换admin并打印
[root@server ~]# sed -n 's/root/admin/gp' ps
admin:x:0:0:admin:/admin:/bin/bash
operator:x:11:0:operator:/admin:/sbin/nologin#将第四行的adm替换为root
[root@server ~]# sed -n '4s/adm/root/p' ps #替换第一个
root:x:3:4:adm:/var/adm:/sbin/nologin
[root@server ~]# sed -n '4s/adm/root/gp' ps #加g,全行替换
root:x:3:4:root:/var/root:/sbin/nologin#将行尾的/sbin/nologin替换为/bin/bash  注意:/需要转义
[root@server ~]# sed -n 's/\/sbin\/nologin/\/bin\/bash/p' ps#注意:上例中替换内容包含路径符号/,可以使用#暂时替代sed命令中的/,可改为
[root@server ~]# sed 's#/sbin/nologin#bin/bash#p'  ps#将最后一行的:替换为@
[root@server ~]# sed -n '$s/:/@/gp' ps
fox_6@x@1000@1000@fox_6@/home/fox_6@/bin/bash#全文注释
[root@server ~]# sed  's/^/#&/p' ps #指定位置处左侧添加#
[root@server ~]# sed  's/^/#/p' ps#检索ssh行在其单词左侧添加一个#
[root@server ~]# sed -n  's/SSH/#&/gp' ps
sshd:x:74:74:Privilege-separated #SSH:/usr/share/empty.sshd:/sbin/nologin
#右侧添加#
[root@server ~]# sed -n  's/SSH/&#/gp' ps
sshd:x:74:74:Privilege-separated SSH#:/usr/share/empty.sshd:/sbin/nologin#所有的行首添加@及行尾添加@
[root@server ~]# sed -e  's/^/@&/' -e ' s/$/&@/' ps#在第一行之前插入空白行
[root@server ~]# sed  '1s/^/\n/' ps#最后一行之后插入空白行
[root@server ~]# sed  '$s/$/\n/' ps#所有小写改为大写,\u表示大写  &:启用正则
[root@server ~]# sed 's/[a-z]/\u&/g' ps#所有大写改小写,\l(小写l):表示小写字母
[root@server ~]# sed -i  's/[A-Z]/\l&/g'  ps#单词第一个字母大写 \b:表示分匹配单词的边界
[root@server ~]# sed 's/\b[a-z]/\u&/g' ps
#实战1:关闭或者打开selinux
[root@server ~]# sed -i '22s/disabled/enforcing/' /etc/selinux/config #实战2:apache的网页目录修改
[root@server ~]# yum install httpd -y
[root@server ~]# sed -i -e  '124s/\/var\/www.html/\/zy/' -e '129s/\/var\/www/\/zy/' /etc/httpd/conf/httpd.conf 
[root@server ~]# vim /etc/httpd/conf/httpd.conf 
#利用替换实现删除#将全文的root删除
[root@server ~]# sed -n 's/root//gp' ps#删除每一行的第一个字符
[root@server ~]# sed -n  's/^.//p' ps 		#.代表任意#删除每一行的最后字符
[root@server ~]# sed -n 's/.$//p' ps#删除注释符#
[root@server ~]# sed -n 's/^#//p' /etc/sos/sos.conf #删除5-10行的所有数字
[root@server ~]# sed '5,10s/[0-9]//g' ps#删除特殊字符(出来数字字母),即将结果写入到t1.txt中
[root@server ~]# sed 's/[^(0-9)(a-z)(A-Z)]//gw t1.txt' ps

文本删除

注意:d操作用于删除文本的特定航,会删除指定的所有内容,则使用该命令必须特别小心,若忘记指定处理行的话会删除所有内容,也不会任何输出

示例 
示例文件
[root@server ~]# cp /etc/sos/sos.conf ~/#删除第一行
[root@server ~]# sed '1d' sos.conf #删除2-5行
[root@server ~]# sed '2,5d' sos.conf #删除8-最后一行
[root@server ~]# sed '8,$d' sos.conf #删除最后一行
[root@server ~]# sed '$d' sos.conf #使用变量最为行号
[root@server ~]# num_line=1
[root@server ~]# sed "${num_line}d" sos.conf #注意双引号#删除空白行
[root@server ~]# sed '/^$/d' sos.conf #删除带[]
[root@server ~]# sed '/\[/d' sos.conf [root@server ~]# sed '/root/d' ps

插入文本

注意:使用a动作在文本最后追加一行,使用i动作在指定行前添加一行,俩者格式相同

 格式
sed '行范围a(或i)\新文本' 文件名
示例
[root@server ~]# sed -i '$a\192.168.228.133 www.openlab.com' /etc/hosts[root@server ~]# sed -i '3i\192.168.228.132 www.openlab.com' /etc/hosts[root@server ~]# sed -i '/132/i\192.168.228.131 www.openlab.com' /etc/hosts#注意:sed是基于数据流处理的命令,若文本无内容则无法处理,座椅空文件无法插入内容
[root@server ~]# touch t2.txt
[root@server ~]# sed -i '$a\xaio ming 19,98.5' t2.txt 
[root@server ~]# cat t2.txt 

3.awk

相关文章:

Linux文本处理三剑客(详解)

一、文本三剑客是什么? 1. 对于接触过Linux操作系统的人来说,应该都听过说Linux中的文本三剑客吧,即awk、grep、sed,也是必须要掌握的Linux命令之一,三者都是用来处理文本的,但侧重点各不相同,a…...

AI在线UI代码生成,不需要敲一行代码,聊聊天,上传图片,就能生成前端页面的开发神器

ioDraw的在线UI代码生成器是一款开发神器,它可以让您在无需编写一行代码的情况下创建前端页面。 主要优势: 1、极简操作:只需聊天或上传图片,即可生成响应式的Tailwind CSS代码。 2、节省时间:自动生成代码可以节省大…...

go-zero整合单机版ClickHouse并实现增删改查

go-zero整合单机版ClickHouse并实现增删改查 本教程基于go-zero微服务入门教程,项目工程结构同上一个教程。 本教程主要实现go-zero框架整合单机版ClickHouse,并暴露接口实现对ClickHouse数据的增删改查。 go-zero微服务入门教程:https://b…...

行政工作如何提高效率?桌面备忘录便签软件哪个好

在行政管理工作中,效率的提高无疑是每个行政人员都追求的目标。而随着科技的发展,各种便捷的工具也应运而生,其中桌面备忘录便签软件便是其中的佼佼者。那么,这类软件又如何帮助我们提高工作效率呢? 首先,…...

利用向日葵和微信/腾讯会议实现LabVIEW远程开发

利用向日葵远程控制软件结合微信或腾讯会议的视频通话功能,可以实现LabVIEW的远程开发和调试。通过向日葵进行远程桌面访问,配合视频通话工具进行实时沟通与问题解决,不仅提高了开发效率,还减少了地域限制带来的不便。介绍这种远程…...

SpringBoot 单元测试 指定 环境

如上图所示,在配置窗口中添加--spring.profiles.activedev,就可以了。...

Flutter 中的 SliverOpacity 小部件:全面指南

Flutter 中的 SliverOpacity 小部件:全面指南 Flutter 是一个功能强大的 UI 框架,由 Google 开发,允许开发者使用 Dart 语言来构建高性能、美观的跨平台应用。在 Flutter 的滚动组件体系中,SliverOpacity 是一个用来为其子 Slive…...

源码分析の前言

源码分析路线图: 初级部分:ArrayList->LinkedList->Vector->HashMap(红黑树数据结构,如何翻转,变色,手写红黑树)->ConcurrentHashMap 中级部分:Spring->Spring MVC->Spring Boot->M…...

接口性能测试复盘:解决JMeter超时问题的实践

在优化接口并重新投入市场后,我们面临着一项关键任务:确保其在高压环境下稳定运行。于是,我们启动了一轮针对该接口的性能压力测试,利用JMeter工具模拟高负载场景。然而,在测试进行约一分钟之后,频繁出现了…...

[数据集][目标检测]猕猴桃检测数据集VOC+YOLO格式1838张1类别

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):1838 标注数量(xml文件个数):1838 标注数量(txt文件个数):1838 标注…...

摸鱼大数据——Hive函数7-9

7、日期时间函数 Hive函数链接:LanguageManual UDF - Apache Hive - Apache Software Foundation SimpleDateFormat (Java Platform SE 8 ) current_timestamp: 获取时间原点到现在的秒/毫秒,底层自动转换方便查看的日期格式 常用 to_date: 字符串格式时间…...

python连接数据库

python连接MYSQL、postgres、oracle等的基本操作 python连接mysql MySQLdb MySQLdb又叫MySQL-python ,是 Python 连接 MySQL 的一个驱动,很多框架都也是基于此库进行开发,只支持 Python2.x,而且安装的时候有很多前置条件&#…...

能不能接受这些坑?买电车前一定要看

图片来源:汽车之家 文 | Auto芯球 作者 | 雷慢 刚有个朋友告诉我,买了电车后感觉被骗了, 很多“坑”都是他买车后才知道的。 不提前研究,不做功课,放着我这个老司机不请教, 这个大冤种他不当谁当&…...

k8s中pod如何排错?

排除Kubernetes Pod故障通常涉及一系列步骤,以诊断问题并找到解决方案。以下是一些常见的故障排除方法: 检查Pod状态: 使用kubectl get pods查看Pod的状态。如果Pod没有处于Running状态,查看更详细的信息,使用kubectl describe …...

【手撕面试题】Vue(高频知识点二)

每天10道题,100天后,搞定所有前端面试的高频知识点,加油!!!,在看文章的同时,希望不要直接看答案,先思考一下自己会不会,如果会,自己的答案是什么&…...

四、.Net8对接Ollama实现文字翻译(.Net8+SemanticKernel+Ollama)本地运行自己的大模型

.Net8SemanticKernelOllama 一、Semantic Kernel官方定义SK能做什么? 二、基本使用1、普通对话2、使用插件实现文本翻译功能 三、IChatCompletionService、ITextGenerationService、ITextEmbeddingGenerationService 很多情况都有这样的需求,使用自有系统…...

初始C++

感谢大佬的光临各位,希望和大家一起进步,望得到你的三连,互三支持,一起进步 个人主页:LaNzikinh-CSDN博客 文章目录 前言一.引用二.内联函数三.类和对象总结 前言 之前讲c的命令空间和第一个程序的运行,继…...

Chapter 5 Current Mirrors and Biasing Techniques

Chapter 5 Current Mirrors and Biasing Techniques 这一章介绍电流镜 5.1 Basic Current Mirrors MOS工作在饱和区, 表现为一个电流源. 考虑电源变化, PVT波动, 我们会首先产生一路精准电流源, 再复制这路电流. 如何复制呢? 电流转电压再转电流就行了, 如下图所示 考虑到…...

Avalonia Image控件上通过鼠标拖动画出矩形框

注册鼠标事件&#xff1a;首先&#xff0c;你需要注册 Image 控件上的鼠标事件&#xff0c;包括 PointerPressed、PointerMoved 和 PointerReleased。你可以在 XAML 文件或代码中注册这些事件。 <Image PointerPressed"Image_PointerPressed" PointerMoved"…...

Wireshark Lua插件入门

摘要 开发中经常通过抓包分析协议&#xff0c;对于常见的协议如 DNS wireshark 支持自动解析&#xff0c;便于人类的理解&#xff0c;对于一些私有协议&#xff0c;wireshark 提供了插件的方式自定义解析逻辑。 1 动手 废话少说&#xff0c;直接上手。 第一步当然是装上wiresh…...

【Python】 -- 趣味代码 - 小恐龙游戏

文章目录 文章目录 00 小恐龙游戏程序设计框架代码结构和功能游戏流程总结01 小恐龙游戏程序设计02 百度网盘地址00 小恐龙游戏程序设计框架 这段代码是一个基于 Pygame 的简易跑酷游戏的完整实现,玩家控制一个角色(龙)躲避障碍物(仙人掌和乌鸦)。以下是代码的详细介绍:…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

AI+无人机如何守护濒危物种?YOLOv8实现95%精准识别

【导读】 野生动物监测在理解和保护生态系统中发挥着至关重要的作用。然而&#xff0c;传统的野生动物观察方法往往耗时耗力、成本高昂且范围有限。无人机的出现为野生动物监测提供了有前景的替代方案&#xff0c;能够实现大范围覆盖并远程采集数据。尽管具备这些优势&#xf…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

WebRTC从入门到实践 - 零基础教程

WebRTC从入门到实践 - 零基础教程 目录 WebRTC简介 基础概念 工作原理 开发环境搭建 基础实践 三个实战案例 常见问题解答 1. WebRTC简介 1.1 什么是WebRTC&#xff1f; WebRTC&#xff08;Web Real-Time Communication&#xff09;是一个支持网页浏览器进行实时语音…...

python爬虫——气象数据爬取

一、导入库与全局配置 python 运行 import json import datetime import time import requests from sqlalchemy import create_engine import csv import pandas as pd作用&#xff1a; 引入数据解析、网络请求、时间处理、数据库操作等所需库。requests&#xff1a;发送 …...

小木的算法日记-多叉树的递归/层序遍历

&#x1f332; 从二叉树到森林&#xff1a;一文彻底搞懂多叉树遍历的艺术 &#x1f680; 引言 你好&#xff0c;未来的算法大神&#xff01; 在数据结构的世界里&#xff0c;“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的&#xff0c;它…...

【Post-process】【VBA】ETABS VBA FrameObj.GetNameList and write to EXCEL

ETABS API实战:导出框架元素数据到Excel 在结构工程师的日常工作中,经常需要从ETABS模型中提取框架元素信息进行后续分析。手动复制粘贴不仅耗时,还容易出错。今天我们来用简单的VBA代码实现自动化导出。 🎯 我们要实现什么? 一键点击,就能将ETABS中所有框架元素的基…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...

深入浅出WebGL:在浏览器中解锁3D世界的魔法钥匙

WebGL&#xff1a;在浏览器中解锁3D世界的魔法钥匙 引言&#xff1a;网页的边界正在消失 在数字化浪潮的推动下&#xff0c;网页早已不再是静态信息的展示窗口。如今&#xff0c;我们可以在浏览器中体验逼真的3D游戏、交互式数据可视化、虚拟实验室&#xff0c;甚至沉浸式的V…...