多くのコードを含むpandoc markdownファイルがあります。sed
.pandocのコード構文は、コードセグメントを開始して終了する3つ以上の「記号」です。
```
Code is here
```
行を抽出できますが、抽出できません。マーカー間。
答え1
sed -n '/^```/,/^```/ p' < input.file
「」の間のすべての行が印刷されますが、「」の行も印刷されます。それを削除するには:
sed -n '/^```/,/^```/ p' < input.file | sed '/^```/ d'
パターンごとに行範囲を使用する方法と、ここから始まる「p」および「d」コマンドのガイドラインを見つけることができます。
答え2
メモ: 私はrundocの主な開発者でありメンテナンスです。
この種の作業のための一般的なツールを探している人は次のとおりです。
文書の実行Markdownファイルで保護されたコードブロックを実行または抽出するための一般的なツールです。 python3の場合は、pip経由でインストールできますpip3 install rundoc
。
コードブロックを抽出します。
rundoc list-blocks your_file.md -t#bash#perl#python
bash
で表示または強調表示されたperl
コードブロックが抽出されます。python
残念ながら、強調表示されたタグのないコードブロックは常に無視されます。
マークダウンファイルをスクリプトとして実行することもできます。
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
。マークダウンファイルはどこにありますか?
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