一个正则错误的背后

写完《WebP部署那些事儿 》,一心想把所有的图片资源都置换成WebP格式。

一个好消息是,基于Hugo自带的Figure简码改造的HEG 用得次数屈指可数,都是用自己更喜欢的![text](url)添加图片资源,方便归纳。不好的消息是,然而截至目前,站内文章达460+篇,如果想要手动对Markdown文件中进行置换的话,工作量浩大。于是乎,注意点自然而然就转移到了如何用正则表达式归纳、然后用unix命令来检索、替换。

首先明确的是,基本思路是先检索当前目录下所有*.MD 文件的内容,如果遇到

![text](url)

就替换为

{{< img src="url" alt="text" >}}

在检索是否还有![text](url)等内容。

试了一个Linux常用的查找替换命令sed

sed -i -r 's/\!\[(.*)\]\((.*)\)/{{<img src="\1" alt="\2">}}/' *.md

但是我这边报错

sed: 1: "s/\!\[(.*)\]\((.*)\)/{{ ...": \2 not defined in the RE

放狗一查,才发现Linux sed和Mac sed是不同体系的,执行起来会有差异,心一横那就咬牙换GNU sed吧。

$ brew install coreutils
$ brew install gnu-sed
GNU "sed" has been installed as "gsed".
If you need to use it as "sed", you can add a "gnubin" directory
to your PATH from your bashrc like:

    PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"
==> Summary
  /usr/local/Cellar/gnu-sed/4.7: 12 files, 561KB

原先是新瓶装旧酒,继续沿用sed

brew install gnu-sed --with-default-names

--with-default-names参数从2019年1月开始就被homebrew移除了 。那还是去繁就简,按建议用gsed命令吧。

gsed -i -r 's/\!\[(.*)\]\((.*)\)/{{<img src="\2" alt="\1">}}/' *.md

一行代码搞定460+篇的指定内容替换,然后记得检索一下是否还有漏网之鱼:

egrep -rn '!\[.*?\]\((.*?)\)' *.md >> checkout.txt
「残留」的链接均在意料之中
「残留」的链接均在意料之中

方便起见,也可以将检索结果输出到当前目录下的checkout.txt里。

egrep -rn '!\[.*?\]\((.*?)\)' *.md >> checkout.txt