一个正则错误的背后
2019年4月7日
约 612 字 需时 2 分钟
深色阅读
写完《WebP部署那些事儿 》,一心想把所有的图片资源都置换成WebP格式。
一个好消息是,基于Hugo自带的Figure简码改造的HEG 用得次数屈指可数,都是用自己更喜欢的添加图片资源,方便归纳。不好的消息是,然而截至目前,站内文章达460+篇,如果想要手动对Markdown文件中进行置换的话,工作量浩大。于是乎,注意点自然而然就转移到了如何用正则表达式归纳、然后用unix命令来检索、替换。
首先明确的是,基本思路是先检索当前目录下所有*.MD 文件的内容,如果遇到

就替换为
{{< img src="url" alt="text" >}}
在检索是否还有
等内容。
试了一个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