在 bash 中,如何使用动态替换替换文件中的字符串

In bash, how do a replace a string in a file with a dynamic replacement

具体来说,我有一个 Markdown 文档,其中列出了数字

```
![Figure XXX](images/figure-of-a-thing.png)
...
![Figure XXX](images/figure-of-another-thing.png)
```

我想以以下结尾:

```
![Figure 1](images/figure-of-a-thing.png)
...
![Figure 2](images/figure-of-another-thing.png)
```

即单调递增的数字。令我印象深刻的是,有些 sed/awk 忍者可以解决这个问题。

我会说

awk '/^!\[Figure/ { sub(/XXX/, ++n) } 1' filename.md

这将用 运行 计数器替换所有以 ![Figure 开头的行中第一次出现的 XXX

如果![Figure序列也可以出现在一行的中间,并且可能在一行中出现多次(我不认为这是可能的,但为了完整起见,让我们考虑这种情况), 你可以使用

awk 'BEGIN { n = 1 } { while(sub(/!\[Figure XXX/, "![Figure " n)) ++n; } 1' filename.md