如何通过命令行仅搜索Jupyter Notebook的Markdown单元格?
当然可以!针对Jupyter Notebook这种JSON格式的文件,我们可以结合文本处理工具精准筛选出Markdown单元格里的内容,下面给你几个实用的方案,总有一个适合你:
方法1:用jq + 搜索工具(最精准,推荐)
Jupyter Notebook本质是JSON结构,用jq(专门的JSON处理工具)可以完美提取出所有Markdown类型的单元格内容,再交给ag/grep搜索目标字符串,完全不会误搜到代码单元格或者其他元数据。
步骤:
- 先确保你安装了
jq(Linux发行版用apt install jq/dnf install jq,macOS用brew install jq) - 执行对应的搜索命令:
- 搜索单个Notebook文件:
jq -r '.cells[] | select(.cell_type == "markdown") | .source[]' notebook.ipynb | ag "要搜索的字符串" - 搜索目录下所有
.ipynb文件:find . -name "*.ipynb" -exec jq -r '.cells[] | select(.cell_type == "markdown") | .source[]' {} \; | ag "要搜索的字符串"
grep,把上面的ag换成grep就行。 - 搜索单个Notebook文件:
方法2:直接用grep正则匹配(无需额外工具)
如果你不想装jq,可以用grep的正则功能来匹配Markdown单元格的内容块,虽然精度略逊于jq,但应急够用:
基础版(适合短内容)
grep -r -A 1000 -B 10 '"cell_type": "markdown"' --include="*.ipynb" . | grep "要搜索的字符串"
-A 1000表示匹配到目标行后再显示后面1000行(覆盖大部分Markdown单元格内容),-B 10显示前面10行确保包含source块--include="*.ipynb"只搜索Notebook文件
进阶版(用PCRE递归匹配,更精准)
如果你的grep支持-P参数(PCRE正则),可以用跨多行匹配来精准定位Markdown单元格的source块:
grep -r -P '(?s)"cell_type": "markdown".*?"source": \[(.*?)\]' --include="*.ipynb" . | grep "要搜索的字符串"
(?s)让.匹配换行符,实现跨多行匹配整个Markdown单元格块
方法3:给ag添加自定义ipynb文件类型支持(最便捷,符合你的需求)
ag支持自定义文件类型的处理规则,我们可以配置让ag识别.ipynb文件,并且只搜索其中的Markdown单元格,用法就和--markdown一样方便:
步骤:
- 创建或编辑
~/.agrc配置文件(如果没有就新建一个) - 添加以下内容(注意转义双引号):
--ipynb=*.ipynb --cmd-ipynb='jq -r ".cells[] | select(.cell_type == \"markdown\") | .source[]"' - 保存后,就可以像搜索Markdown文件一样搜索Notebook了:
ag --ipynb "要搜索的字符串" .
这个配置告诉ag:遇到.ipynb文件时,先用jq提取Markdown单元格内容,再进行搜索,完全符合你想要的“类似--markdown的便捷方式”!
内容的提问来源于stack exchange,提问作者marnix
相关产品推荐
相关产品推荐

