从 markdown 文件中提取三重反引号围栏代码块 ``` 摘录

从 markdown 文件中提取三重反引号围栏代码块 ``` 摘录

我有一个 pandoc markdown 文件,其中有很多代码。我想从文件中提取所有代码位,最好使用sed. pandoc中代码的语法是三个或更多````符号来开始和结束代码段。

```
Code is here
```

我可以提取一行,但我无法提取标记之间

答案1

sed -n '/^```/,/^```/ p' < input.file

将打印 ``` 之间的所有行,但也包括 ``` 行。要摆脱它:

sed -n '/^```/,/^```/ p' < input.file | sed '/^```/ d'

您可以找到如何按模式使用行范围以及从此处开始的“p”和“d”命令的说明:

http://www.grymoire.com/Unix/Sed.html#uh-29

答案2

笔记: 我是 rundoc 的主要开发者和维护者。


对于为此类事情寻找通用工具的任何人:

运行文档是一个通用工具,用于从 Markdown 文件中运行或提取受防护的代码块。您可以通过 pip for python3: 来安装它pip3 install rundoc

提取代码块:

rundoc list-blocks your_file.md -t#bash#perl#python

将提取带有bash,perlpython突出显示标记的代码块。不幸的是,没有突出显示标签的代码块总是被忽略。

您还可以将 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确保正则表达式将迭代地应用于文件内容,以便找到所有匹配项。

相关内容