O problema com seu comando é que, mesmo com o sinalizador g
definido, uma parte específica do texto a ser correspondido só pode ser incluída em uma correspondência única . Como .*
é ganancioso, você só acabará removendo o caractere final do pipe. Sem mencionar que o seu espaço no texto de substituição está no lugar errado.
Você poderia fazer isso com um comando s
repetido em um loop, sendo executado até que não corresponda a nada. Assim:
sed -e ':looplabel' -e 's/\(START.*\)|\(.*|\[END\)/ /;t looplabel'
Ou usando um rótulo de loop mais curto:
sed -e ':t' -e 's/\(START.*\)|\(.*|\[END\)/ /;tt'