正则表达式匹配并包括特殊的ANSI ESC控制字符

时间:2017-08-17 03:30:42

标签: javascript regex special-characters

我从基于javascript的节点应用程序的输出到stderr生成了一个日志文件。 (输出到txt文件来自一个名为' logfile-grunt'的grunt插件,准确无误)

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

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

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

日志文件中的示例输出,如Sublime文本中显示为纯文本:

ESC[0K

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

    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

2 个答案:

答案 0 :(得分:0)

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

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

在这种情况下,你只需用''替换第二个捕获组来实现你想要的东西,或者你可以用$ 1替换完整匹配来重新包含文件数和换行符。

答案 1 :(得分:0)

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

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

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