Друпал - усугубляем бардак с алиасами

У меня исторически имеет место бардак с именами URL: все они порождены из заголовков записей, но

  • В большинстве случаев дефис заменен подчеркиванием (и в заголовок данной записи специально добавлен дефис, чтобы проверить).
  • В некоторых случаях дефис оставлен дефисом, это привет MovableType, настроенного по умолчанию из лета 2008 года.
  • В некоторых случаях дефис вовсе скушали, какая-то версия MT заменяла конструкцию ' - ' не на '___' и не на '_-_', а на '__'.
Причем, как выяснилось по логам, есть внешние ссылки на разные представления одного и того же, уж не знаю откуда они взялись.

Проблема лечится вот таким вот SQL-оператором (regexp_replace() - чисто постгресовское, MySQL-аналог найдите сами. Это только для nodes, с таксономией в моем случае проблем нет совсем.

 insert into url_alias(src,language,dst) select src,language,regexp_replace(dst,'-','_','g') from url_alias where src like 'node%' and dst like '%-%';
Ну, точнее, надо конечно писать скрипт такого примерно вида (это Perl+DBI), потому что вышеприведенный оператор сломается, если какой-то алиас из добавляемых уже есть:
my $sel = $db->prepare("select * from url_alias where src like 'node%' and dst like '%-%'");
my $ins = $db->prepare("insert into url_alias(src,dst,language) values(?,?,?)");
$sel->execute;
my $cnt=0;
while (my $d = $sel->fetchrow_hashref)
  {
    my $dst2 = $d->{dst};
    $dst2=~s/-/_/g;
    $cnt+=$ins->execute($d->{src},$dst2,$d->{language});
    $dst2=~s/___/__/g;
    $cnt+=$ins->execute($d->{src},$dst2,$d->{language});
  }
Вторая замена - это подавление трех подчеркиваний.

В скрипте нету транзакций, поэтому он имеет право ругаться на дублирующий алиас (и не добавлять).