Sed

使用 sed 正則表達式將 html 錨點轉換為 markdown

  • April 25, 2020

我一直在慢慢地將我的部落格轉換為降價。最後要做的是用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/")

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 使用跟隨?量詞來匹配最短重複,標準正則表達式不
  • 否定字元類用於解決此問題

引用自:https://unix.stackexchange.com/questions/582407