As variáveis não são expandidas quando colocadas entre aspas simples; você precisa usar aspas duplas:
... sed -i -e "s/$from/$to/g" ...
Estou tentando escrever uma função bash simples para pesquisar e substituir recursivamente por um diretório, alterando uma cadeia para outra. Aqui está o que eu tenho:
function sar () {
from="$1"
shift
to="$1"
shift
if [[ $from == '' || $to == '' ]]
then
echo Usage: sar \<from\> \<to\> \<filename\>
return
fi
while [[ $# -gt 0 ]]
do
filename="$1"
shift
find ./$filename -type f -exec sed -i -e 's/$from/$to/g' {} \;
done
}
Por exemplo:
$ sar xxxx yyyy mydir
deve executar find
in ./mydir e substituir xxxx por yyyy em todos os arquivos visitados. O comando é executado, não produz nenhum erro, mas não executa nenhuma substituição.
Rodando com set -x
, vejo
+ find ./mydir -type f -exec sed -i -e 's/$from/$to/g' '{}' ';'
$from
e $to
não foram resolvidos, e algumas citações extras apareceram.
Qual é a maneira correta de escrever esse comando dentro de uma função bash (que eu suponho que obedeça às mesmas regras de sintaxe que um script bash)?
As variáveis não são expandidas quando colocadas entre aspas simples; você precisa usar aspas duplas:
... sed -i -e "s/$from/$to/g" ...