如何移除Jupyter Notebook文件grep输出中的控制序列、ANSI颜色码及ANSI转义码
如何移除Jupyter Notebook文件grep输出中的控制序列、ANSI颜色码及ANSI转义码
我来帮你解决这个问题!当你用grep查找Jupyter Notebook文件时,遇到那些像\u001b[32m这类的ANSI转义码确实很影响阅读,这里有几种实用的方法可以帮你清除它们:
方法一:用sed过滤转义码
sed是处理文本的常用工具,可以通过正则表达式精准匹配并移除ANSI颜色控制码。你可以在grep之后管道sed命令:
grep "INFO" your_notebook.ipynb | sed 's/\x1b\[[0-9;]*m//g'
解释一下:
\x1b代表ASCII转义字符(对应你看到的\u001b)\[[0-9;]*m匹配ANSI颜色码的标准格式(比如[32m、[1;36m这类)- 这个命令会把所有颜色控制码替换为空,输出干净的文本
方法二:用perl处理更通用的ANSI转义序列
如果你的输出里还有其他类型的ANSI转义码(不止颜色码),perl的正则可以覆盖更全面的情况:
grep "INFO" your_notebook.ipynb | perl -pe 's/\e\[[0-9;]*[a-zA-Z]//g'
这里的\e和\x1b是同一个意思,[a-zA-Z]匹配转义码的结尾字符(比如m、H、J等),能处理更多类型的控制序列。
方法三:用Python脚本批量清理Notebook文件
如果你想直接修改Notebook文件,把里面所有的ANSI转义码都去掉,可以用Python脚本处理(毕竟Jupyter Notebook本身就是JSON格式的文件):
import re import json # 替换为你的Notebook文件名 notebook_path = "your_notebook.ipynb" cleaned_path = "cleaned_notebook.ipynb" # 定义移除ANSI转义码的函数 def strip_ansi_codes(text): # 匹配所有ANSI转义序列的正则 ansi_pattern = re.compile(r'\x1b\[[0-9;]*[a-zA-Z]') return ansi_pattern.sub('', text) # 读取并解析Notebook文件 with open(notebook_path, "r", encoding="utf-8") as f: nb_data = json.load(f) # 遍历所有单元格,清理输出文本 for cell in nb_data["cells"]: if "outputs" in cell: for output in cell["outputs"]: if "text" in output: # 处理每一行文本 output["text"] = [strip_ansi_codes(line) for line in output["text"]] # 保存清理后的文件 with open(cleaned_path, "w", encoding="utf-8") as f: json.dump(nb_data, f, indent=2)
运行这个脚本后,你会得到一个没有ANSI转义码的干净Notebook文件,之后再用grep查找就不会看到那些乱码了。
另外补充一下:你遇到的这个情况是因为Loguru默认输出带颜色的日志,Jupyter会把这些颜色控制序列直接保存到Notebook文件里,上面的方法不管是临时过滤输出还是永久清理文件都能解决问题~
备注:内容来源于stack exchange,提问作者Constantin Hong
相关产品推荐
相关产品推荐

