(Это должен быть комментарий, но у меня недостаточно репутации, чтобы добавить комментарий ...)
Вы только что поджарили мой мозг. В моем Cygwin происходит то же самое. Я был потрясен. Кажется, это ошибка в том, как обрабатываются подстановочные знаки, используют ли они синтаксис регулярного выражения или стиль glob (стиль glob - это где * означает «любое число любого типа символа», регулярное выражение * означает «0 или больше предыдущих персонажей ».
Итак, я попробовал это в моей оболочке QNX. Это работает, если я не пытаюсь использовать плюс перед ошибкой, как в "s/^ +bug -/__/". Я могу заменить * вместо +, и это работает. Я думаю, что некоторые реализации sed испытывают трудности с выбором регулярного выражения или синтаксиса glob, и в результате возникает непредсказуемый беспорядок.
Я не пробовал Perl (пока не установил его на этой новой машине), но я был бы вдвойне шокирован, если бы Perl справился с ним так плохо.
Чтобы ответить на ваш вопрос, насколько мне известно и ~ 100 000 моих ближайших друзей в Google, вы точно понимаете, как должен работать оператор ^.