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!$!\!');