Ищем пары слов, первое с разделителем оставляем как есть, а второе заменяем.
s/что искать/на что заменить/флаги
«что искать» - regexp поиска «на что заменить» - строка замены «флаги» - модификаторы, например «g» означает искать не до первого совпадения, а сколько угодно совпадений (и столько же замен делать).
\w - любой символ, который может быть в слове (буквы, цифры, «_», ...); \w+ - последовательность из 1 и более таких символов, т.е. это шаблон нашего «слова»; \W - любой разделитель (символ, не входящий в понятие «слово»), если разделителем должен быть пробельный символ, нужно заменить \W на \s; \W+ - 1 и более разделителей
\w+\W+\w+ - это словоРАЗДЕЛИТЕЛИслово нам нужно заменить второе, значит всё, что кроме второго, выделяем скобками - (\w+\W+)\w+ в строке замены указываем как менять - \1замена \1 - это то, что выделили в шаблоне первыми скобками, «замена» - слово-заменитель, т.е. словоРАЗДЕЛИТЕЛИслово -> словоРАЗДЕЛИТЕЛИзамена
И так для каждой пары. sed, когда ищет и делает замены, продолжает поиск с места строки, на котором остановился, а не каждый раз сначала. Следовательно все слова будут обработаны попарно.