结构正则表达式入门:用ad的EDIT模式实现强大的批量文本编辑
结构正则表达式入门:用ad的EDIT模式实现强大的批量文本编辑
【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad
批量处理文本时,大多数人第一反应是写脚本或使用 sed、awk,但结构正则表达式提供了一条更优雅的路径:把"找到文本"和"处理文本"拆分成一步步可组合的操作,让复杂的批量文本编辑变得清晰可控。ad是一款"可适应"的 Rust 文本编辑器,它借鉴了 Plan 9 中 sam 编辑器的结构正则表达式思想,通过内置的EDIT 模式,让你只需一条命令就能完成跨多行的查找、过滤、替换与重组。本文是面向初学者的结构正则表达式入门指南,带你快速上手这个强大的批量文本编辑工具。
什么是结构正则表达式?
普通正则表达式擅长匹配"一行"或"一段连续字符",而结构正则表达式擅长处理"文本的结构"。它不要求你一次写出完美的大正则,而是允许你分步骤逼近目标:
- 先用循环命令切出感兴趣的区域(如每个函数、每个段落);
- 再用过滤命令剔除不关心的内容;
- 最后对保留下来的部分执行插入、删除、替换或打印。
这种"先定位、再操作"的方式,特别适合处理代码文件、日志、配置文件等多行结构文本。
ad 的 EDIT 模式是什么?
ad是一款融合了 vim 模态编辑、kakoune 多光标思想与 acme 可扩展理念的编辑器。它的模式除了常见的 NORMAL、INSERT、COMMAND、RUN 之外,还有一个专门执行结构正则表达式的EDIT 模式,其命令语言源自 Plan 9 的 sam 编辑器。
在 EDIT 模式中,你只需输入:
Edit , s/mouse/clicky thing/g即可把整个缓冲区中所有mouse替换为clicky thing——这看起来和 sed 很像,但真正的威力在于下面这些命令的组合。
核心命令速查表:一次掌握批量文本编辑
| 命令 | 含义 | 典型用途 |
|---|---|---|
s/re/template/ | 替换 | 全文替换(等价于x/re/ c/template/) |
x/re/ | 循环匹配 | 对每个匹配执行后续操作 |
y/re/ | 在匹配之间循环 | 按分隔符把文本切成块 |
g/re/ | 过滤匹配 | 只保留匹配的行或块 |
v/re/ | 过滤非匹配 | 排除匹配的行或块 |
i/template/ | 匹配前插入 | 批量添加前缀 |
a/template/ | 匹配后插入 | 批量添加后缀 |
c/template/ | 替换每个匹配 | 批量改写 |
d | 删除每个匹配 | 批量删除 |
p/template/ | 按模板打印 | 提取信息生成报告 |
命令前的地址(如,表示整个缓冲区,14,24表示第 14 到 24 行)决定了操作范围,这也来自 sam 的 dot 思想——ad把"当前选区"当作一个可移动、可叠加的焦点,src/exec/addr.rs 中实现了这套地址解析。
实战一:批量删除与替换
删除所有空行,只需一条命令:
Edit , x/^\n/ d把每个单词改为大写开头的占位符:
Edit , x/\b\w+\b/ c/{0}/实战二:用嵌套命令处理多行结构
结构正则表达式最迷人的地方在于嵌套组合。下面这个例子来自官方教程 docs/tour/structural-regex2:从第 14 到 24 行中,找出所有职业为 programmer 的人名并打印。
Edit 14,24 y/\n\n/ x/@*occupation: programmer@*/ x/name: (.*)/ p/{1} is a programmer\n/拆开来看:
y/\n\n/—— 按空行把选区切成一个个段落;x/@*occupation: programmer@*/—— 只保留包含该职业的段落;x/name: (.*)/—— 在段落内提取姓名;p/{1} is a programmer\n/—— 用模板输出结果。
一次执行,直接生成Alice is a programmer这样的报告。这就是结构正则表达式"分步定位"的核心优势。
实战三:模板变量让批量编辑更强大
除了{0}(整个匹配)、{1}、{2}(捕获组)之外,ad的模板还支持三个上下文变量:{FILENAME}、{ROW}、{COL}。这在脚本化提取信息时非常有用。
项目自带的示例脚本 examples/scripts/result_fns.ad 演示了如何扫描 Rust 文件中所有返回Result的函数:
, x/fn@*?\{/ g/->.*Result.*\{/ x/fn (\w+)@*?-> (.*?) \{/ p/({FILENAME}) {1} returns {2}\n/流程清晰:选中全文 → 找到函数签名 → 过滤出返回 Result 的 → 提取函数名和返回类型 → 打印带文件名的报告。配合ad -f 脚本路径 文件路径的命令行模式,你甚至可以把这些操作固化成可复用脚本,比如 examples/scripts/impl_blocks.ad 和 examples/scripts/fancy_impl_blocks.ad 展示了如何从源码中批量提取 impl 块及其函数签名。
更进一步:深入 ad 的实现
- 结构正则表达式的解析与执行引擎:src/exec/mod.rs
- 地址语法与 dot 操作:src/exec/addr.rs
- 命令运行器(支持执行外部命令):src/exec/runner.rs
- 自研的正则引擎(可处理字符流):src/regex/
- 更完整的命令列表:docs/tour/structural-regex
小结
结构正则表达式的学习曲线并不陡峭:只需记住x(循环)、y(切块)、g/v(过滤)这几个组合子,再加上i/a/c/d/p几个动作,就足以应付绝大多数批量文本编辑场景。而ad把这一整套能力放进了 EDIT 模式,让你在编辑器内就能完成从"定位"到"改写"的完整流程。如果你经常面对多行结构文本,不妨从今天的一条Edit , x/.../ c/.../命令开始,体验这种更接近思维过程的编辑方式。
【免费下载链接】adan adaptable text editor项目地址: https://gitcode.com/gh_mirrors/ad5/ad
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
