Удаление адресов электронной почты из импортированных постов

Всем привет

Я настраиваю экземпляр Discourse для организации, которая сейчас использует рассылку — мы импортировали письма (20 тысяч сообщений) без серьёзных проблем, однако во многих постах из-за цитирования, подписей в письмах и т.п. отображаются адреса электронной почты.

Я достаточно хорошо разбираюсь в командной строке rake/rails, но не могу понять, как удалить эти адреса. Я пробовал разные варианты (с регулярными выражениями и без), но ни один не находит ни одного поста.

rake posts:remap["<vincent@domain\.com>","[удалено]","regex"]
rake posts:remap["\\<vincent@domain\\.com\\>","[удалено]","regex"]

Есть ли более эффективный способ? Я начал с простого регулярного выражения, чтобы найти свой собственный адрес (и да, у меня есть резервная копия!).

Поскольку это новый экземпляр Discourse, меня не беспокоит удаление каких-либо упоминаний @.

Спасибо.

Вот быстрый скрипт, который @pfaffman написал для нас. Всё, что получилось неуклюже, — это мои правки. В нём есть несколько дополнительных функций, которые могут вам не понадобиться, например, дата отсечки, чтобы удалять адреса электронной почты только из постов, созданных до этой даты.

Я обнаружил, что лучше заменять адреса на ‘email@removed.com’, а не удалять их полностью. Не помню точно почему — думаю, это лучше сочетается с окружающими скобками.

def remove_email_addresses
  n=0 
  test_mode=false 
  dt=DateTime.new(2019, 1, 1, 0, 0, 0) 
  no_emails="email@removed." 
  Post.where("raw like '%@%'").find_each do |post| 
    sleep 0.1 
    if post.created_at < dt 
      post.raw.gsub!(/[a-z0-9+-_.]+@[a-z0-9+-]+[. ,;\\]/i,no_emails) 
      if test_mode 
        puts post.raw 
        sleep 10 
      end 
      post.save unless test_mode 
      post.rebake! unless test_mode 
      puts "saved" 
      n+=1 
      puts n.to_s 
    else 
      puts "new post, leaving as-is" 
    end 
  end 
  nil 
end

> remove_email_addresses

Отлично, спасибо, я попробую.