Suas tentativas não estão funcionando porque você está tentando usar operadores de shell como && e > no comando executado por find , mas você está digitando esses operadores diretamente no comando, então eles é executado pelo shell que está chamando find . Seus comandos são analisados como
find … > tmp.$$ && mv …
por exemplo. a primeira invocação find é
find ./ -type f -exec sed 's/$quoted_searchstring/$quoted_replacementstring/' infile
com saída redirecionada para tmp.$$ . Há outros problemas com o comando: infile deve ser {} (é o arquivo que find encontrou), e as aspas simples ao redor da expressão sed devem ser aspas duplas, já que você está usando variáveis shell lá. / p>
Como você precisa usar construções de shell no comando executado por find , informe find para executar um shell.
find … -exec sh -c '…' {} \;
Para evitar dificuldades de citação, passe as coisas que precisam ser citadas, como a expressão sed, como argumentos para sh .
find ./ -type f -exec sh -c '
sed "$0" "$1" >"$1.new" && mv "$1.new" "$1"
' "s/$quoted_searchstring/$quoted_replacementstring/" {} \;
Para um pequeno ganho de desempenho com uma leve perda de legibilidade, você pode usar o formulário -exec … {} + e um loop de shell.
find ./ -type f -exec sh -c '
for x; do
sed "$0" "$x" >"$x.new" && mv "$x.new" "$x";
done
' "s/$quoted_searchstring/$quoted_replacementstring/" {} +
Como alternativa, se a versão de ksh93 em seu AIX não for muito antiga, você poderá usar seu recurso de globalização recursiva (introduzido no ksh93p).
set -G
for x in **; do
[[ -f $x ]] || continue
sed "s/$quoted_searchstring/$quoted_replacementstring/" "$x" >"$x.new" && mv "$x.new" "$x";
done
Em qualquer caso, observe que você também precisará ajustar sua conversão de string para regexp para produzir uma expressão regular básica, pois o sinalizador -r para usar ERE é uma extensão GNU. Além disso, seu código existente tem alguns bugs: você esqueceu de citar barras e não está citando os caracteres certos no texto de substituição.
quoted_searchstring=$(printf %s "$raw_searchstring" | sed 's![[\/.^$*]!\&!g');
quoted_replacementstring=$(printf %s "$raw_replacementstring" | sed -e 's![][\/&]!\&!g' -e '!$ s!$!\!');