Quando você expande a variável sedi , o que está acontecendo é que o '' é passado para sed como um argumento, em vez disso, para criar um argumento vazio conforme o esperado.
A melhor maneira de ver isso é tornar sua variável sedi uma matriz:
if $darwin; then
sedi=(sed -i '')
else
sedi=(sed -i)
fi
E use assim:
"${sedi[@]}" "s/VERSION =.*;/VERSION = \"${lver}\";/g" Version.java
Caso contrário, acho que a única maneira de transformar seu '' em um argumento real vazio é usar eval com sua declaração original:
eval $sedi '"s/VERSION =.*;/VERSION = \"${lver}\";/g"' Version.java
No entanto, esta é uma solução um pouco desagradável, uma vez que você tem que adicionar uma camada extra de aspas / escapes para o resto do comando. Também é geralmente uma boa (e segura) prática evitar o uso de eval quando possível.
Atualizar
Como comentado abaixo, a criação de uma função funcionará. Na mesma faixa, um alias é provavelmente o método mais curto:
if $darwin; then
alias sedi="sed -i ''"
else
alias sedi="sed -i"
fi
Simplificando o uso:
sedi "s/VERSION =.*;/VERSION = \"${lver}\";/g" Version.java