如何通过sed、awk或perl将bash函数定义转换为一个markdown围栏块



我有一堆bash函数,我想转换成markdown代码块。例如,其中一个是这样的:(函数内部可能有一些嵌套的花括号和空行)

upr()
{
for chr; do
case $chr in
[a-z]*) chr_opts="-n" nxt -32 "$chr" ;;
*) printf "%c${sep}" "$chr" 2>/dev/null ;;
esac
done
}

我想这样修改:

```bash
upr()
{
for chr; do
case $chr in
[a-z]*) chr_opts="-n" nxt -32 "$chr" ;;
*) printf "%c${sep}" "$chr" 2>/dev/null ;;
esac
done
}
```

我的想法是将函数定义(作为段落处理)放入sed保持空间并添加标记。我如何使用sed、awk或perl或任何方法来做到这一点?

declare -fp func?

$ myFuncs=( foo bar qux )
$ for f in "${myFuncs[@]}"; do
printf '```bashn'; declare -fp "$f"; printf '```nn'
done
```bash
foo () 
{ 
echo "I am function foo"
}
```
```bash
bar () 
{ 
echo "I am function bar"
}
```
```bash
qux () 
{ 
echo "I am function qux"
}
```

对于多行函数

funcname()
{
....
}

$ awk '/()/{print "```bash"}{ print }/^}$/{print "```"}' input_file
```bash
upr()
{
for chr; do
case $chr in
[a-z]*) chr_opts="-n" nxt -32 "$chr" ;;
*) printf "%c${sep}" "$chr" 2>/dev/null ;;
esac
done
}
```
```bash
func2()
{
foo="bar"
while :; do
echo ${#foo}
sleep 5
done
}
```
```bash
func3()
{
foo=2 bar=1
echo "${foo}" "$bar"
}
```

Save changes inplace

$ awk -i inplace '/()/{printf "```bashn"}{ print }/^}$/{print "```"}' input_file

这可能适合您(GNU sed):

sed -e '/^S+s*()/!b;i```bash' -e ':a;n;/^}/!ba;a```' file

在函数前插入``` bash,在函数后附加```