ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Notepad++排版进阶:从正则到Python脚本的批量自动化文本处理

Notepad++排版进阶:从正则到Python脚本的批量自动化文本处理 作为一个常年跟文本打交道的人我电脑里装过的编辑器少说也有十来款但真正让我离不开的还是Notepad。尤其是“排版”这俩字看着简单真做起来能让人头秃——你可能是要把一段日志整理成规整表格可能是要把几千行JSON压缩成一行给接口调试用也可能只是想把某个PDF复制出来的乱码段落重新排列成可读的文本。这些活我全都用Notepad干过而且从手工排版逐步进化到批量自动化整个过程积累了不少可以复用的经验。这篇就来聊聊我的排版思路和实操技巧。我不会一上来就丢一堆快捷键让你背而是按“先想清楚排什么版再做基础操作再上正则再上宏和脚本最后用插件兜底”的路径来走每一步都会给出具体的操作步骤和参数选项也包含不少我踩过的坑。你不需要有编程基础只要会点工具栏和右键菜单就能从零开始把你的排版工作搬到Notepad上当然如果你已经在用正则表达式后半段关于宏和Python脚本自动化的内容也会对你有价值。1. 排版问题的本质先搞清楚你到底在排什么1.1 文本排版的两个维度格式与结构很多人一提到“排版”就默认是Word里调字体、调行距、调页边距。但在Notepad里做的排版核心并不是“视觉美化”而是“格式清洗”和“结构重构”。格式清洗指的是把乱七八糟的空白符、换行符、全角半角字符、重复符号整理成规范形态。比如我从网页上复制一段代码黏贴到Notepad后发现行尾全是^M其实是CRLF前面还带着一堆nbsp;转义出来的空格这就是典型的格式脏数据需要在编辑器里清洗掉。结构重构则是更高一层的事把一段没有规律的文本重新组织成表格、JSON、XML、Markdown或CSV这种带明确结构的数据。比如你手里有几十条用户留言格式是“用户名张三 / 城市北京 / 留言太棒了”要做成一个Excel能直接导入的CSV那就不只是删空格的问题而是要按分隔符拆字段、按行重组甚至需要批量给每行套上相同的模板。想清楚自己到底是在清洗格式还是在重构结构决定了后面选什么工具和方案。如果只是格式清洗用查找替换加上几个基础的编辑器功能就够了要是涉及结构重构就需要正则表达式甚至写一点Python脚本。这个判断是很多新手容易忽略的上来就瞎替换反而把数据弄得更乱。1.2 为什么不用Word、Excel或专业排版软件排版这个需求用Word也能做用Excel也能做用各种在线工具也可以但Notepad的优势有三个快、稳、可编程。快是指启动速度和编辑大文件的流畅度。一个几十MB的日志文件Word打开要转圈Notepad基本秒开而且滚动不卡。稳是说不容易出现格式错乱。Word会自动纠正你的引号、首字母大写、自动编号这些“智能”功能在处理数据时全是坑比如你把一段JSON黏进Word它会“贴心”地把直引号变成弯引号直接把JSON搞废。Notepad不会干这种事它就是朴素的纯文本编辑器所见即所得。可编程是最关键的一点。排版这种事最怕的就是“重复劳动”比如你要给100个文件都加上相同的页眉或者要把1000行数据的第3列和第5列调换位置手工干一次可以干100次会疯。Notepad支持宏录制、Python脚本还可以批量打开多个文件统一处理这些都是Word和在线工具很难高效完成的。所以如果你想建立一个“专业排版环境”Notepad作为文本处理的中转站和工作台是再合适不过的选择。2. 基础操作篇把编辑器的显示和编辑能力发挥到极致2.1 显示所有字符让隐藏问题现形我见过很多人排版排得浑身难受其实不是操作不会而是看不见“隐形字符”。空格、制表符、换行符、行尾符这些符号在屏幕上默认是不显示的但它们的混乱恰恰是排版问题的根源。在Notepad里我习惯先打开“视图 - 显示符号 - 显示空格与制表符”再打开“显示行尾符”。开了这两个选项之后你会立刻看到文本里那些过去被忽略的细节有些行尾是CRLFWindows换行、有些是LFUnix换行、有些地方明明看起来是缩进其实混着4个空格和1个制表符。这一步看起来基础但能救命的点在于很多后续操作比如正则匹配、宏录制、Python脚本都是基于这些隐藏字符来工作的。你如果不知道文本里有CRLF还是LF正则写\r?\n的时候就会踩坑。我甚至建议把这两个显示选项设置为默认开启做法是“设置 - 首选项 - 视图”里勾上相应选项这样每次打开新文件都是“肉眼可见的干净”。2.2 缩进、换行与编码排版的三板斧处理纯文本排版时缩进、换行、编码这三个东西最基础也最容易乱。缩进方面Notepad默认是用Tab缩进但不同工具对Tab的解析不同比如Python就对Tab和空格混用极其敏感。我一般都会在“设置 - 首选项 - 语言”里把Tab键替换为空格通常设成4个空格。这个设置对写代码的人来说几乎是刚需处理普通文本时也建议保持一致避免后续在别的工具里打开时错位。换行方面涉及的其实是行尾符。Windows的CRLF和Linux的macOS的LF经常打架从不同系统拷来的文本混在一起时正则匹配会变得很麻烦。处理方案是“编辑 - 行尾转换 - 转换为Windows格式CRLF”或“转换为Unix格式LF”把整个文件的换行统一。注意行尾转换操作是全局的会改变文件原格式如果文件还要回传Linux服务器就选LF如果在Windows本地编辑选CRLF问题不大。编码方面最经典的大坑是UTF-8 BOM和UTF-8无BOM的区别。带BOM的文件在一些Linux环境下会多出一个不可见字符\ufeff导致脚本第一行判断出错。Notepad会在编码菜单里明确标出“转为UTF-8-BOM编码”和“转为UTF-8编码”的区别。我的经验是纯文本和脚本文件一律用UTF-8无BOM如果是Windows记事本创建的文件要保留BOM也能正常显示但一旦要喂给Linux工具建议“转为UTF-8编码”去掉BOM。2.3 列编辑模式批量录入和表格化处理的秘密列编辑是Notepad里最“出圈”的功能之一也是很多人第一次体验“编辑器原来还能这么玩”的瞬间。按住Alt键再用鼠标纵向拖选就能选中一个矩形区域。这个矩形区域就是所谓的“列”。你可以对这块列区域做三种常用操作第一种是批量输入。先选中要填充的整列然后直接打字这个字会同时出现在每一行对应的位置。比如你有100行数据每一行都需要在第1列前面加上ID,这个前缀按住Alt拖选第1列输入ID,100行就全部改好了。第二种是列块删除。比如每行的结尾都有同样的尾巴字符串按住Alt纵向选中所有尾巴按Delete就能全部删除。第三种是列编辑器的数字填充功能。选中一列后菜单“编辑 - 列编辑”会弹出一个对话框里面有“数字插入”、“首尾附加”等选项。最常用的场景是把一列数字填充为1到100的序列号或者按某个步进值递增这对生成测试数据、给表格补行号非常方便。列编辑的局限性在于它只能在“已经对齐”的文本上操作。如果各行长度不统一列选出来的范围会参差不齐这时候就要先用正则或其他手段把文本按列补齐再上列编辑。这是一个很容易忽略的细节。3. 正则表达式从手工排版到半自动化的关键一步3.1 正则基础字符、数量、位置如果你的排版工作还停留在手工查找替换那效率天花板大概也就到这儿了。想进阶到“批量自动化”正则表达式是绕不开的一道坎。Notepad的查找替换窗口CtrlH里勾选“正则表达式”模式就能使用一套基于C std::regex语法默认是ECMAScript风格的匹配规则。正则的核心是三个东西字符、数量、位置。字符类用来匹配某个范围内的字符比如\d匹配数字、\w匹配字母数字下划线、\s匹配空白字符方括号[a-z]可以匹配任意小写字母。数量修饰符用来控制前面的字符出现多少次比如*代表0次或多次、代表1次或多次、{2,5}代表2到5次。位置锚点用来限定匹配的位置^匹配行首、$匹配行尾、\b匹配单词边界。举个最典型的例子想把每行开头多余的空格删掉可以用查找^[ \t]替换为空。这里的^就是位置锚点[ \t]匹配一个或多个空格或Tab。这和直接按Backspace删除的区别是正则一次就能处理几千行。3.2 分组合并把一列数据重排成表格正则真正强大的地方在于分组和替换。用圆括号()可以把匹配到的内容捕获成组在替换时用$1、$2引用第一组、第二组。举个例子你有100行电话号码格式是“张三:13900001111”想把它们变成Markdown表格行| 张三 | 13900001111 |。如果手工做复制粘贴100次会崩溃。用正则是这样的查找(.):(\d{11})替换为| $1 | $2 |这个操作的核心逻辑是把每一行拆成“第1组任意多个字符”和“第2组11位数字”然后重新装配成新格式。排版结构重组的本质就是这样的“拆解-重装”过程你只需要定义好分组规则剩下的交给正则。再进阶一点的处理如果输入的原始行是“张三 139-0000-1111 北京”你想输出成“| 北京 | 张三 | 13900001111 |”也就是把城市提到最前面同时把电话号码里的横杠去掉。正则这样写查找(.)\s(\d{3})-(\d{4})-(\d{4})\s(\w)替换为| $5 | $1 | $2$3$4 |这里的核心是数量词和分组的配合\s匹配空白(\d{3})捕获前3位区号后面$2$3$4直接把三个数字片段拼接成不带横杠的号码。3.3 排除法处理不需要的行和重复项排版不光要“留下想要的内容”还要“剔除不想要的内容”。常见的三类场景我分别给出处理思路。第一类是删除空行。查找^\s*$替换为空再配合“文本整理 - 删除空行”的菜单操作能快速把一段夹杂大量空白的文本压成紧凑排列。如果只想删除连续空行中多余的几个留下一个空行做段落分隔就查找^\s*\n替换成\n。注意这里的\s*可能会吞掉空格和Tab所以需要先确认文件里的“空行”是真的空行还是“看起来空但带着空格”的行。第二类是去除重复行。Notepad没有一键去重功能但可以这样先把所有行排序“编辑 - 行操作 - 升序排列”然后正则查找重复行并删除。具体写法是查找^(.)$\s^\1$替换为\1重复执行几次直到查找不到。这个方法有局限性因为\1引用的是整个第一组的完整内容行内容里如果有特殊字符匹配会失败。另一个思路是使用“工具 - 删除重复行”的插件比如TextFX里的Sort lines case insensitive Delete Duplicate Lines这更稳妥后面会聊到插件。第三类是删除匹配指定模式的行。比如日志文件里所有DEBUG级别的行都不想要了最直接的方式是用“搜索 - 标记”功能把匹配行标记出来再到“搜索 - 书签 - 删除书签行”。具体步骤是在查找框输入^.*DEBUG.*$勾选“标记行”点击“标记全部”这时匹配行尾部会出现蓝色书签标记然后“搜索 - 书签 - 删除书签行”一键清掉所有被标记的行。这个方法比用替换把行内容删成空行要干净得多因为删除的是整行不会留下空行残渣。4. 真正的批量自动化宏录制与Python脚本实战4.1 录制宏把重复操作录一遍以后一键执行正则虽然高效但有些排版动作是“多步骤组合操作”先删除行尾空格再转换大写再插入一行分隔符。这种情况下每次重复执行同样的组合很烦而Notepad的宏功能就是为这种场景准备的。宏的用法很简单菜单“宏 - 开始录制”然后你正常做一遍要重复的操作操作期间所有编辑动作都会被记录下来完成后点“宏 - 停止录制”然后“宏 - 保存当前录制的宏”给它起个名字、指定快捷键以后就能随时一键执行同一套操作。这里有几个容易翻车的细节第一宏记录的是“编辑动作”而不是“文件状态”。所以如果你在录制过程中使用了查找替换宏会记录下具体的查找字符串和替换字符串。这意味着宏里的查找目标如果包含特定文本那么每次执行宏时都会去查找那段文本。如果需要匹配动态内容宏就不灵了要转到Python脚本。第二宏录制过程中最好不要用鼠标点击菜单。鼠标操作经常不会被正确记录或者记录了奇怪的坐标位置导致回放时出错。最稳妥的方式是全程用键盘快捷键完成操作。第三录制前想清楚“重复的边界”。比如你要对50个文件做同样操作那宏只解决“单个文件内的多步骤重复”文件之间的切换和打开关闭还需要另外的方式比如Python脚本和“文件批量操作”。4.2 Python Script插件让自动化真正起飞宏能解决的场景还是比较有限尤其在需要“读取变量、判断分支、操作多个文件”的时候。这时候就该上Python Script插件了。Python Script是一个Notepad插件装好之后菜单栏会出现一个“插件 - Python Script”子菜单里面可以打开脚本控制台、新建脚本、运行脚本。脚本运行在Notepad进程内能访问Notepad的编辑接口也就是说你可以用Python代码来操作当前文档的选中区域、全文内容、行号、查找结果等。举一个我经常用的例子批量给日志文件的每一行加上“时间戳前缀”。如果用宏你得先想好当前日志从哪一行开始如果用Python脚本则可以直接运行# 给当前文档每一行加上时间戳前缀 import time editor.selectAll() text editor.getSelText() lines text.splitlines() new_lines [] for line in lines: if line.strip() : new_lines.append() else: ts time.strftime(%Y-%m-%d %H:%M:%S) new_lines.append([ ts ] line) editor.replaceSel(\n.join(new_lines))这段代码的思路是先全选文本读取内容按行拆分逐行处理最后替换回去。其中editor是Notepad的编辑器对象selectAll和getSelText是从Scintilla接口继承的方法。整个过程完全是Python语法如果你写过一点Python上手会非常快。Python Script还能操作剪贴板、书签、查找结果列表甚至可以调用外部命令行工具比如把当前文档保存后运行一个外部格式化程序。这等于把Notepad从“编辑器”拓展成了“自动化工作台”。4.3 批量处理整个文件夹用脚本替换宏的边界很多人以为要在Notepad里批量处理多个文件只能手动一个个打开。其实Python Script配合Python标准库就能做到。在Python Script环境里可以直接用os.listdir读取某个目录下的所有文件逐个打开、处理、保存。关键是用notepad.open()和notepad.close()这样的Notepad接口来操作文件而不是直接用Python的open()去读写文件因为前者会触发Notepad的编码识别和界面刷新更适合“在编辑器环境里处理”的场景。下面这个例子可以批量把C:\logs下所有.txt文件的CRLF转成LF并删除行尾空格import os folder C:\\logs for fname in os.listdir(folder): if fname.endswith(.txt): path os.path.join(folder, fname) notepad.open(path) editor.selectAll() text editor.getSelText() text text.replace(\r\n, \n) lines [] for line in text.split(\n): lines.append(line.rstrip()) editor.replaceSel(\n.join(lines)) notepad.save() notepad.close()这里有个细节值得注意notepad.open()打开文件后编辑器内容会被替换editor.replaceSel()替换的是当前“选中区域”的内容所以需要先selectAll。如果文件特别大一次性全选再替换可能会卡遇到超大文件时更稳妥的做法是逐行读取并生成新内容后直接写入临时文件再替换但那属于高级优化日常排版到不了这个量级。批量自动化还有一个轻量级方案用“文件 - 打开文件所在文件夹”打开整体目录然后使用“搜索 - 在文件中查找”CtrlShiftF跨文件查找、替换。不过这个功能对“对每个文件执行不同操作”是无能为力的它只能统一替换所有文件中完全相同的字符串。真正做批量自动化还是Python脚本最顺手。5. 插件生态让格式化、对比和JSON处理如虎添翼5.1 JSON格式化与JSON Viewer在接口对接、数据分析、日志排查这些场景里JSON是出现频率最高的数据格式。而“排版”在这里要做的通常是两件事压缩和美化。压缩指的是把格式化好的、带缩进的JSON压成一行方便在URL参数或命令行里传输。做法是全选JSON内容然后“插件 - JSON Viewer - Format JSON”旁边有一个“Compress JSON”选项不同版本的菜单名称可能略有差异但大逻辑一致。美化则是反过来把一行挤在一起的JSON展开成可读的层级结构。选中内容后执行“Format JSON”即可。这里有个大坑如果JSON本身有语法错误格式化会失败甚至弹窗提示。所以格式化前先确认JSON是否合法可以用JSON Viewer里的“Show JSON Tree”功能它会用树形视图展示JSON的层级并指出解析失败的位置。很多人不知道的是Notepad新版其实内置了JSON格式化功能在“插件”菜单里可能默认没有需要从插件管理器安装而不一定非要去搜“JSON Viewer插件下载”。我用的是官方插件管理器里的JSON Viewer装好后右下角还能看到JSON结构树对排查多层嵌套特别友好。这几年新版Notepad的插件管理器做得比较完善直接在“插件 - Plugins Admin”里搜JSON装好重启就完事。5.2 Compare插件排版前后的差异对比批量自动化处理之后最担心的就是“改错了”。你处理完100个文件怎么快速确认哪些地方被改动、改动是否符合预期这时候就需要Compare插件。Compare插件安装后可以“插件 - Compare - Compare”将当前打开的两个文档进行对比。它会用不同颜色标出新增、删除、修改的部分并且在左侧边缘显示差异的缩略图。处理大批量文件时我经常把“原始文件”和“处理后文件”同时打开再执行Compare逐处检查差异。这比肉眼对比效率高得多也避免“正则替换把某一段内容不小心替换掉”这种意外漏网。还有个小技巧在处理前先给文件做一份备份目录处理完成后用Beyond Compare或Diff工具对目录做整体对比跟Compare插件配合使用能形成一套完整的“处理-校验-确认”闭环。5.3 TextFX与轻量级格式整理工具Notepad的老用户对TextFX一定不陌生这个插件虽然已经非常老旧但里面有几个功能至今仍未被替代尤其是“TextFX Characters”和“TextFX Tools”。最常用的几个功能是“Sort lines case insensitive”忽略大小写排序适合给关键词列表去重前排序。“Delete duplicate lines”删除重复行和排序配合可以快速清理去重。“UnEscape”把HTML实体amp;等还原为普通字符。“HTML to Text”把带HTML标签的内容提取纯文本。这些功能在“插件 - TextFX”菜单下。新版Notepad默认不带TextFX需要去插件管理器搜索安装。由于TextFX年久失修只支持32位老版本的说法比较多但我实测下来新版的64位Notepad里TextFX的常用功能还是可以用的只是部分子菜单可能失效。如果你不想折腾TextFX也可以考虑用“编辑 - 空白操作”里自带的“去除行尾空白”和“去除行首空白”功能。新版Notepad内置了修剪空白的能力这在排版中太常用了——很多从PDF复制出来的文本行尾会带一堆尾部空格直接把处理后的CSV文件搞出不必要的分隔符问题。6. 实战案例日志批量清洗排版的完整流程6.1 案例背景为什么这个任务必须自动化前阵子我接到一个活有数十个日志文件每个大小都在1MB-10MB之间内容是从不同系统导出的原始日志混杂着DEBUG、INFO、WARN、ERROR四种级别每行格式不统一有的带时间有的不带有的行尾有额外空格有的行还会因为内容里包含换行符而断成两截。需求是把所有这些文件统一成“时间 | 级别 | 消息”的CSV格式并且只保留WARN和ERROR两种级别还要去掉重复行。这种任务要是靠手工排版那真是体力活且极易出错。我当时的处理思路是先用正则完成单文件的格式清洗再用Python脚本批量处理多文件最后用Compare校验结果整个过程大约用了一个多小时包括排错调试的时间。下面把关键步骤拆开讲。6.2 完整操作实录正则加脚本三步走第一步先分析单个文件的格式。打开一个日志文件观察它的典型行是什么样。比如发现有两种典型行2025-01-12 10:00:01 [INFO] server started [WARN] disk space low第二步用正则把两种格式统一成“日期 | 级别 | 消息”。这里要写两个正则分别处理处理带日期的行查找^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[(\w)\] (.*)$替换为$1|$2|$3处理不带日期的行查找^\[(\w)\] (.*)$替换为|$1|$2日期字段留空。这里的关键是替换后所有行都变成“日期|级别|消息”结构但级别字段还在。如果文件里还有其他奇异格式比如日志中间夹着分隔线----------那就继续写正则把不需要的符号行删除或改成空行。第三步在单文件上验证无误后把这一整套清洗动作写进Python脚本让它遍历整个文件夹。我的脚本核心部分大概是import os, re folder C:\\logs_input output C:\\logs_output for fname in os.listdir(folder): if not fname.endswith(.log): continue path os.path.join(folder, fname) notepad.open(path) editor.selectAll() text editor.getSelText() # 统一换行 text text.replace(\r\n, \n) lines text.split(\n) new_lines [] for line in lines: # 删除只有分隔符的行 if re.match(r^\s*-{3,}\s*$, line): continue # 匹配带时间的行 m re.match(r^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) \[(\w)\] (.*)$, line) if m: if m.group(2) in (WARN, ERROR): new_lines.append(m.group(1) | m.group(2) | m.group(3)) continue # 匹配不带时间的行 m2 re.match(r^\[(\w)\] (.*)$, line) if m2: if m2.group(1) in (WARN, ERROR): new_lines.append(| m2.group(1) | m2.group(2)) # 写回 editor.replaceSel(\n.join(new_lines)) notepad.saveAs(output \\ fname) notepad.close()这里面有两点实操心得一是notepad.saveAs()可以把处理后的文件保存到新目录保留原始文件不动。这比“原地覆盖”稳妥得多一旦处理结果有问题原文件还在备份里。二是用re.match而不是re.search因为日志行大概率是“行首开始匹配”match能避免把“消息内容里夹着[ERROR]”这种字段误判为级别。第三步的输出再人工抽查几个文件确认格式无误然后做一个“去除重复行”的后续清洗。我使用的是排序加删除重复行的组合先打开处理后的文件全选用“编辑 - 行操作 - 按字典序排列”再用TextFX的Delete Duplicate Lines最后再按“时间”字段排序一次。这样能把完全相同且相邻的重复日志行合并掉。如果希望保留顺序且去重正则方法也行但大数据量下建议用脚本处理。6.3 我踩过的坑与排查思路整个过程里我踩过几个坑列在这里供你参考。第一个坑是正则的贪婪匹配。比如我要匹配“从[到]之间的日志级别”如果写^\[(.*)\] (.*)$在消息内容本身也包含]的情况下贪婪匹配会把最后一个]当作结束导致级别字段捕获到一大串消息。解决办法是使用非贪婪匹配^\[(.*?)\] (.*)$或者更精确的^\[([A-Z])\] (.*)$用字符范围来限定级别只能是英文大写字母。第二个坑是空行和空白符。日志文件里经常有看似空行、实际是\t或空格组成的行。使用re.match(r^\s*$)才能把这些假空行也识别出来并跳过而单纯判断line 会漏掉很多脏行。第三个坑是跨行断行。日志消息内容里可能包含换行导致一个逻辑日志被拆成两行这种情况最复杂。我的排查思路是先用正则统计“不匹配任何已知格式的行”观察这些行是不是上一条日志的延续如果是就需要在Python脚本里做“拼接上一行”的逻辑当某行不匹配任何格式时把它的内容追加到上一行的末尾。这个处理很依赖具体日志格式我给不了通用代码但思路是可以复用的。第四个坑是中文乱码。日志文件编码可能是GBK也可能是UTF-8处理前最好先确认编码。在Notepad里看到中文正常不代表保存后用其他工具读也正常。我的做法是批量处理前先做一个编码探测Python脚本里用chardet判断编码再用codecs按源编码读取、按目标编码写出。这样就不会出现打开是中文、保存后全变问号的惨剧。6.4 一些想补充的心得说实话排版自动化这件事真正的门槛不在于工具而在于“你能不能把自己的处理规则说清楚”。如果能说清楚规则把它翻译成正则或脚本就是水到渠成的事如果连规则都是模糊的比如“把空行去掉、把奇怪的字符删掉”那再强的工具也救不了你。我的习惯是动手处理前先拿一个样本文件手工做一遍把每一步都记下来等规则确定了再去Notepad里录宏或写脚本。这跟写程序前先写伪代码是一个道理。后续要扩展成“设计师排版字体下载后批量重命名并整理文件目录”“照片排版打印辅助工具批量导入图片路径”这类任务思路也是一模一样的确定规则拆解动作然后用Notepad的正则、宏、脚本去完成。再多说一句插件别一上来就装一堆插件格式化用JSON Viewer对比用Compare写脚本用Python Script这三个基本覆盖了我99%的排版自动化需求。剩下1%的特殊需求直接写Python脚本调用系统命令反而更简单痛快。最后分享一个我个人偏好任何批量操作执行前先把原文件复制到backup目录。Notepad本身没有版本管理万一脚本有个隐藏Bug把一百个文件处理错了没有备份就只能哭。这个习惯我坚持了多年也确实帮我避免过几次灾难性的大规模误替换。
返回列表