Решение только для sed проще, если у вас есть версия GNU с командой e
.
Тем не менее, вот быстрая, упрощенная и немного неуклюжая версия, которую я выбил, которая не мешает проверять значения предыдущих или последующих строк - она просто предполагает, что у вас хороший формат, и проходит без каких-либо циклов или чего-либо еще остальное. Тем не менее, для моего примера кода это сработало.
Я начал с создания a
, b
и x
, который является файлом разметки.
$: cat a
#! /bin/bash
echo "Hello, World!"
$: cat b
#! /bin/bash
echo "SCREW YOU!!!!"
$: cat x
```
$ cat a
foo
bar
" b a z ! "
```
```
$ cat b
foo
bar
" b a z ! "
```
Затем я написал s
, который является sed
сценарием.
$: cat s
#! /bin/env bash
sed -En '
/^```$/,/^```$/ {
# for the lines starting with the $ prompt
/^[$] / {
# save the command to the hold space
x
# write the ``` header to the pattern space
s/.*/```/
# print the fabricated header
p
# swap the command back in
x
# the next line should be blank - add it to the current pattern space
N
# first print the line of code as-is with the (assumed) following blank line
p
# scrub the $ (prompt) off the command
s/^[$] //
# execute the command - store the output into the pattern space
e
# print the output
p
# put the markdown footer back
s/.*/```/
# and print that
p
}
# for the (to be discarded) existing lines of "content"
/^[^`$]/d
}
' $*
Это делает работу и может начать вас.
$: s x
```
$ cat a
#! /bin/bash
echo "Hello, World!"
```
```
$ cat b
#! /bin/bash
echo "SCREW YOU!!!!"
```
Множество предостережений - лучше на самом деле проверить, что $
следует за строкой обратных символов и сопровождается пустой строкой, возможно, убедитесь, что в файле не было ничего поддельного для выполнения ... но это делает то, что вы спросил, с (GNU) sed
.
Удачи.