web-dev-qa-db-ja.com

sed正規表現を使用してhtmlアンカーをマークダウンに変換する

私は自分のブログをゆっくりとマークダウンに変換してきました。最後に行うことは、すべての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/")
3
devilkin

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/)
  • これは元の式とまったく同じですが、sedのようにファイルを1行ずつ読み取って出力するPerl -pで使用されます。

sedでEREを使用する同様の正規表現を次に示します。

$ sed -E 's/<a[^>]*href="([^"]*)[^>]*>([^<]*)[^>]*>/[\2](\1)/g' test
on [reddit](https://www.reddit.com/) or [Lifehacker](https://lifehacker.com/)
  • PCREは a ?に続く量指定子 を使用して最短の繰り返しに一致しますが、標準の正規表現では一致しません
  • これを回避するために否定文字クラスが使用されます
2
guest