在Node.js中利用`fs`模块和正则表达式,可自动将文件中仅含`(C)`的独立行合并到前一行末尾,同时删除空行,避免误伤正文中的`(C)`。该方法通过两次替换覆盖中间行与文件末尾,兼容Unix和Windows换行符,适用于日志标记、模板生成等场景。
Node.js 自动合并文本文件中的(C)行到上一行并删除空行
作者:技术拾光
时间:2026-06-18
浏览:661
文章目录
处理生成的 TXT 文件时,常遇到一种尴尬情况:某些标记像 (C) 被单独列成一行,想把它们“提”到上一行末尾,同时删掉那个孤零零的空行。这事儿用 Node.js 的 fs 模块加正则就能搞定,但方法不对容易翻车。
问题概述
这篇文章介绍如何使用 Node.js 的 `fs` 模块和正则表达式,精准定位只包含 `(c)` 的独立行,将其合并到前一行末尾,并删除原行。此方法适用于自动化处理 TXT 文件时的常见场景,例如日志标注、模板生成或文档注释自动化。
常见误区
很多人首选直接使用正则替换,例如 `/rn.*(C).*$/gm`。这种做法存在一个显著问题:它会误伤自身内容中包含 `(C)` 的行,比如 `Wor(C)d1`,导致整行被替换为 ` (C)`,数据丢失。理想的处理应是仅移除独立存在的 `(C)` 行,而非影响正文中的 `(C)` 内容。
正确方案
实施步骤分为三步:
- 识别真正独立的 (C) 行——整行仅包含空格和 (C),无其他字符;
- 将其合并到前一行末尾——添加一个空格后接上 (C);
- 删除原行,同时处理可能遗留的空行。
以下为经过打磨的代码实现:
const fs = require('fs');
function mergeCLine(filePath) {
const content = fs.readFileSync(filePath, 'utf8');
// 匹配:行首可选空白 + (C) + 行尾可选空白,且前后均有换行(或开头/结尾)
// 使用捕获组保留前一行,并安全替换
const result = content
.replace(/(^|n)([^n]+)s*ns*(C)s*(=n|$)/g, '$1$2 (C)')
.replace(/ns*(C)s*$/g, ' (C)'); // 处理文件末尾的 (C)
fs.writeFileSync(filePath, result);
return result;
}
// 示例调用
console.log(mergeCLine('./myFile.txt'));
关键正则解析
- 正则 `/^(n|^)([^n]+)s*ns*(C)s*(=n|$)/gm` 中的 `([^n]+)` 精准捕获前一行的非空内容,避免误删整行数据;
- `(=n|$)` 是正向先行断言,保证 (C) 后面紧跟换行或文件结尾,防止匹配跨行内容;
- 使用两次 `replace` 分别处理中间行和文件末尾行,确保覆盖所有位置;
- 采用同步 `readFileSync` 和 `writeFileSync`,易于嵌入文件生成流程,无需处理异步回调。
注意事项
- 本方案默认处理 Unix (`n`) 和 Windows (`rn`) 换行符。如需严格兼容 `rn`,可将正则中的 `n` 替换为 `(rn|n)`。
- 若文本中存在多个 (C) 行需逐行向上合并(如嵌套结构),则应改用逐行解析的数组遍历方式,避免混乱。
- 生产环境中建议使用 try/catch 包裹异常,并检查文件是否存在及编码是否为 UTF-8,防止意外报错。
总结
此方法简洁可靠,可无缝嵌入构建脚本或后端服务。每次生成 TXT 文件后自动执行一次,即可修复语义化格式,提升处理效率。
实用工具推荐
电子包浆
使用 ›绿化、压缩、噪点和虚拟水印,自由调节做旧程度。
图片压缩
使用 ›选择画质和输出格式,预览压缩前后的大小。