【问题标题】:Regex match between and including special ANSI ESC control character正则表达式匹配(包括特殊 ANSI ESC 控制字符)
【发布时间】:2017-08-20 09:46:54
【问题描述】:

我有一个从基于 javascript 的节点应用程序的输出到 stderr 的日志文件。 (到 txt 文件的输出是来自一个名为“logfile-grunt”的 grunt 插件)

javascript 程序的其他部分正在控制台输出上生成“进度条”。 在控制台输出中,进度条只是一个不断更新的单行,但在日志文件中,进度条的每个状态都记录在日志文件中,由我认为是 ANSI 转义码的某种特殊字符包围:@每行开头的 987654321@ 和 ESC[0K,其中 'ESC' 是单个符号。

我想使用正则表达式检查日志文件并匹配进度条中的所有内容,包括转义码并将其删除。

与此匹配的 javascript 正则表达式是什么?

以纯文本形式显示在日志文件中的示例输出:

    uploading images
    NUMBER OF IMAGE FILES: 406
    ESC[1G[--------------------------------------------------] 1/406ESC[0K
    ESC[1G[=-------------------------------------------------] 2/406ESC[0K
    ESC[1G[==------------------------------------------------] 3/406ESC[0K
    ESC[1G[===-----------------------------------------------] 4/406ESC[0K
    ESC[1G[====----------------------------------------------] 5/406ESC[0K
    -----------------------------------------------
    >> Task completed, blah blah

使用基于正则表达式的查找和替换工具后,我希望文件看起来像:

    uploading images
    NUMBER OF IMAGE FILES: 406
    -----------------------------------------------
    >> Task completed, blah blah

它只是将进度条行与我需要匹配的特殊控制字符匹配的正则表达式

编辑 显示带有行号的输出示例:

    1    uploading images
    2    NUMBER OF IMAGE FILES: 406
    3    ESC[1G[--------------------------------------------------] 1/406ESC[0K
         ESC[1G[=-------------------------------------------------] 2/406ESC[0K
         ESC[1G[==------------------------------------------------] 3/406ESC[0K
         ESC[1G[===-----------------------------------------------] 4/406ESC[0K
         ESC[1G[====----------------------------------------------] 5/406ESC[0K
    4    -----------------------------------------------
    5    >> Task completed, blah blah

【问题讨论】:

  • /\x1b[1G(.*)\x1b[0K/g 似乎正在选择我需要的东西。 \x1b 选择 ANSI 转义字符,[ 选择方括号,后跟 1G 字面选择 .... 然后任何带有 (.*) 的内容,直到用 \x1b[0K 选择 ESC[0K。由于日志文件的一些部分包含此文本,因此我想删除正则表达式以 /g 结尾,以表明我想要的不仅仅是第一个匹配项。
  • 您可能还想在末尾包含一个 '\n' 以删除换行符(取决于您的替换作品)

标签: javascript regex special-characters


【解决方案1】:

要意识到的重要一点是,我试图匹配以 ESC 字符为前缀的 ANSI 转义码。 因此要匹配 ESC 字符,即十六进制的 ASCII 字符 1B,选择器是 \x1b

所以我的正则表达式变成了

/\x1b\[1G.*\x1b\[0K/g

【讨论】:

    【解决方案2】:

    由于数据似乎总是格式正确,因此您可以采用匹配您知道将出现的特定字符串并将其间的所有内容分组的方法。

    (FILES: \d+\n)([\s\S]*\n(\s)*)-
    

    在这种情况下,您只需将第二个捕获组替换为 '' 即可实现您要查找的内容,或者您​​可以将完整匹配替换为 $1 以重新包含文件数和换行符。

    【讨论】:

    • 这似乎选择从“文件”开始,然后执行所有操作,包括我不想删除的行
    猜你喜欢
    • 1970-01-01
    • 2021-11-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-28
    • 2013-09-21
    相关资源
    最近更新 更多