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