我有一个 pandoc markdown 文件,其中有很多代码。我想从文件中提取所有代码位,最好使用sed
. pandoc中代码的语法是三个或更多````符号来开始和结束代码段。
```
Code is here
```
我可以提取一行,但我无法提取标记之间。
答案1
sed -n '/^```/,/^```/ p' < input.file
将打印 ``` 之间的所有行,但也包括 ``` 行。要摆脱它:
sed -n '/^```/,/^```/ p' < input.file | sed '/^```/ d'
您可以找到如何按模式使用行范围以及从此处开始的“p”和“d”命令的说明:
答案2
笔记: 我是 rundoc 的主要开发者和维护者。
对于为此类事情寻找通用工具的任何人:
运行文档是一个通用工具,用于从 Markdown 文件中运行或提取受防护的代码块。您可以通过 pip for python3: 来安装它pip3 install rundoc
。
提取代码块:
rundoc list-blocks your_file.md -t#bash#perl#python
将提取带有bash
,perl
或python
突出显示标记的代码块。不幸的是,没有突出显示标签的代码块总是被忽略。
您还可以将 markdown 文件作为脚本运行
rundoc run your_file.md -t#bash#perl#python
这将执行具有匹配突出显示标记的所有代码块,并使用突出显示标记来查找正确的解释器。
笔记:要获得没有 JSON 或标头的纯代码,请使用jq
工具:
rundoc list-blocks your_file.md | jq -r "(.code_blocks[] | {code}).code"
答案3
您可以使用 pandoc 本身从所有代码块中提取代码。 (这些说明适用于 pandoc 版本 >= 2.0。不需要其他软件;pandoc 包含一个 lua 解释器。)。
创建一个包含以下内容的文件extractcode.lua
:
function CodeBlock(el)
print(el.text)
end
现在运行 pandoc,如下所示,myfile.md
你的 markdown 文件在哪里:
pandoc --lua-filter extractcode.lua myfile.md -o /dev/null
这将打印所有代码块的内容。请注意,这将包括全部中的代码块myfile.md
,包括缩进代码块。与其他答案中提出的 sed 解决方案不同,它还将包括出现在缩进上下文中的代码块,例如列表项或块引用:
1. ```lua
a = 5
````
> ```
> my code
> ```
并且它不会被这样的事情混淆,其中反引号是代码块的一部分而不是分隔符:
````
```
code example with three backticks as part of the code block
```
````
答案4
您还可以使用perl
:
perl -0777e '$_=<>;print $1 while /^`{3,}\s*\n(.*?)^`{3,}\s*\n/msg' your_file
解释
- 该
0777
部分设置输入记录分隔符 ($/
) 以读取整个文件 - 正则表达式查找以 3 个或更多反引号开头的行,然后匹配并捕获尽可能少的行(由惰性量词保证
*?
),后跟以 3 个或更多引号开头的行。 - 正则表达式修饰符
m
确保^
匹配行的开头而不仅仅是文件的开头。修饰符s
确保.
匹配换行符,以便.*?
可以匹配多行。最后g
确保正则表达式将迭代地应用于文件内容,以便找到所有匹配项。