Я полагаю, что выражение sed s/&([^ ]*);/&\1;/g
сделает замену, которую вы ищете. Я не знаком с заменой строк в boost, но в документации сказано, что она поддерживает регулярные выражения в стиле sed.
Edit: после тестирования его в sed, выражение, похоже, нуждается в еще большем экранировании. s/\&\([^ ]*\);/\&\1;/g
работает для моих тестовых случаев.
Редактировать 2: Немного улучшено выражение и разбивка:
s#&\([^[:space:]]*\);#\&\1;#g
Шаблон ввода:
&
начинается с буквального символа &
\([^[:space:]]*\)
сопоставление и захват любого количества непробельных символов
;
оканчивается литералом;
Схема вывода:
\&
литеральный символ & (необходимо экранировать в шаблоне вывода, поскольку & обычно представляет всю совпадающую строку там)
amp;
литерал
\1
распечатать захваченную строку непробельных символов
;
буквальный;