Node.js 自动合并文本文件中的(C)行到上一行并删除空行

作者:技术拾光时间:2026-06-18 08:23:14浏览:662

在Node.js中利用`fs`模块和正则表达式,可自动将文件中仅含`(C)`的独立行合并到前一行末尾,同时删除空行,避免误伤正文中的`(C)`。该方法通过两次替换覆盖中间行与文件末尾,兼容Unix和Windows换行符,适用于日志标记、模板生成等场景。

处理生成的 TXT 文件时,常遇到一种尴尬情况:某些标记像 (C) 被单独列成一行,想把它们“提”到上一行末尾,同时删掉那个孤零零的空行。这事儿用 Node.js 的 fs 模块加正则就能搞定,但方法不对容易翻车。

问题概述

这篇文章介绍如何使用 Node.js 的 `fs` 模块和正则表达式,精准定位只包含 `(c)` 的独立行,将其合并到前一行末尾,并删除原行。此方法适用于自动化处理 TXT 文件时的常见场景,例如日志标注、模板生成或文档注释自动化。

常见误区

很多人首选直接使用正则替换,例如 `/rn.*(C).*$/gm`。这种做法存在一个显著问题:它会误伤自身内容中包含 `(C)` 的行,比如 `Wor(C)d1`,导致整行被替换为 ` (C)`,数据丢失。理想的处理应是仅移除独立存在的 `(C)` 行,而非影响正文中的 `(C)` 内容。

正确方案

实施步骤分为三步:

  1. 识别真正独立的 (C) 行——整行仅包含空格和 (C),无其他字符;
  2. 将其合并到前一行末尾——添加一个空格后接上 (C);
  3. 删除原行,同时处理可能遗留的空行。

以下为经过打磨的代码实现:

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 文件后自动执行一次,即可修复语义化格式,提升处理效率。