我一直在慢慢地将我的博客转换为 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
?
跟随量词为了匹配最短的重复,标准正则表达式不 - 否定字符类用于解决此问题