Это регулярное выражение будет делать то, что вы хотите в одной строке кода Perl, без неэффективного цикла while (который заставляет регулярное выражение начинаться каждый раз с начала) или без просмотра:
s/((href="|\G)[^"]*?&)amp;/$1/g;
Хитрость заключается в том, чтобы использовать \ G, чтобы регулярное выражение "помнило", что оно было внутри атрибута href.
Это регулярное выражение также правильно заменяет & amp; с & amp;
Единственный недостаток в том, что если & произойдет в самом начале строки темы, она также будет заменена. Если вы хотите избежать этого, используйте:
s/((href="|\G(?!\A))[^"]*?&)amp;/$1/g;