使用 sed 正则表达式将 html 锚点转换为 markdown

使用 sed 正则表达式将 html 锚点转换为 markdown

我一直在慢慢地将我的博客转换为 Markdown。最后要做的就是用 markdown 替换所有 html 锚点。

我提出了这个 sed 正则表达式,无论出于何种意图和目的,它都应该满足我的要求,但事实并非如此。

来源数据:

$ cat /tmp/test
on <a href="https://www.reddit.com/" target="_blank" rel="noopener">reddit</a> or <a href="https://lifehacker.com/" target="_blank" rel="noopener">Lifehacker</a>

sed命令:

$ sed -r 's/<a.*?href="(.*?)".*?>(.*?)<\/a>/[\2](\1)/g' /tmp/test
on [Lifehacker](https://lifehacker.com/" target="_blank" rel="noopener)

我希望它返回什么:

on [Reddit](https://reddit.com/) or [Lifehacker](https://lifehacker.com/")

答案1

sed使用基本和扩展正则表达式 (BRE/ERE)。.*?是 Perl 兼容正则表达式 (PCRE) 的一部分。

要使用 PCRE,请使用perl

$ perl -pe 's/<a.*?href="(.*?)".*?>(.*?)<\/a>/[\2](\1)/g' test
on [reddit](https://www.reddit.com/) or [Lifehacker](https://lifehacker.com/)
  • 这与原始表达式完全相同,但与perl -p它一起使用,逐行读取和打印文件 - 就像sed做的那样

这是使用 ERE 的类似正则表达式sed

$ sed -E 's/<a[^>]*href="([^"]*)[^>]*>([^<]*)[^>]*>/[\2](\1)/g' test
on [reddit](https://www.reddit.com/) or [Lifehacker](https://lifehacker.com/)
  • PCRE用途a?跟随量词为了匹配最短的重复,标准正则表达式不
  • 否定字符类用于解决此问题

相关内容