Você tenta modificar apenas a parte correspondente à regex no seu endereço, mas, depois que o endereço coincide, a substituição afeta a linha inteira. O truque é ter apenas o que você deseja alterar no espaço de padrão ao aplicar a transformação. Este comando faz isso:
sed '/--\(+-\)*-/{:a;h;s/.*\(--\(+-\)*-\).*//;y/+-/-+/;G;s/\(.*\)\n\(.*\)--\(+-\)*-\(.*\)//;/--\(+-\)*-/ba}' <<< '--+++-+--+--++-+--++--+-+--++--+-++-+-'
Eu pouco é mais fácil de ler:
/--\(+-\)*-/ { # Match a line containing the pattern
:start # Label to branch back to
h # Copy pattern space to hold space
s/.*\(--\(+-\)*-\).*// # Remove everything but pattern
y/+-/-+/ # Swap + and -
G # Append hold space to pattern space
s/\(.*\)\n\(.*\)--\(+-\)*-\(.*\)// # Rearrange pattern space
/--\(+-\)*-/b start # If there are more occurrences, branch to start
}
Observe que isso provavelmente não funcionará com os comentários, y
parece ter um problema com eles.
Teste com uma string de exemplo:
$ sed -f sedscr <<< '--+++-+--+--++-+--++--+-+--++--+-++-+-'
--+++-+++-++++-+--++++-+-++++--+-++-+-
Dois pontos para mencionar sobre o comando sed na pergunta:
-
\<
e\>
correspondem a limites de palavras, mas você só quer agrupar:\(\)
- Se você tiver um mapeamento direto de caracteres para alterar, poderá usar o comando de transformação
y
em vez de várias substituições