在bash中,如何用动态替换替换文件中的字符串
具体地说,我有一个降价文档,其中列出了如下数据在bash中,如何用动态替换替换文件中的字符串,bash,awk,sed,Bash,Awk,Sed,具体地说,我有一个降价文档,其中列出了如下数据 ``` ![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) ``` 即,具有
```
![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
这将替换以开头的所有行中第一次出现的XXX
![图
带有运行计数器
如果<代码>![图< /代码>序列也可以出现在一行中,也可能在一行中出现几次(我不认为这是可能的,但是为了完整性,让我们考虑一下这个例子),您可以使用
awk 'BEGIN { n = 1 } { while(sub(/!\[Figure XXX/, "![Figure " n)) ++n; } 1' filename.md
太棒了。我不得不做一个小小的改变,但是在钱上:`` awk'BEGIN{n=1}{if(sub(/XXX/,n)){++n;}}``啊,好吧。如果不担心误报,那当然更简单。如果你愿意的话,你可以把它进一步缩减到
awk'BEGIN{n=1}sub(/XXX/,n){n}1'
。