Você está usando a ferramenta errada. wc contará linhas de entrada, mas como você está usando sed -i , não há linhas impressas, então nada para wc contará. Mesmo sem isso, o comando sed teria imprimido todas as linhas do arquivo para que ainda não funcionasse corretamente. Aqui está uma abordagem diferente:
-
Use perl ao invés
find . -name \*.php \ -exec perl -i -lpe 's|finddddd|replaceeeee|g && print STDERR "."' {} \; \ 2>&1 | wc -lO truque é imprimir um
.cada vez que um substituto for bem-sucedido e passar os resultados porwc. O-iflag edita o arquivo no local e o-lfaz com que uma nova linha seja adicionada a cada chamada deprint. O-pdiz ao perl para imprimir cada linha de entrada depois de aplicar o script passado por-e. Como estamos editando o arquivo, precisamos imprimir em STDERR para evitar que o.seja adicionado ao arquivo. O STDERR é então redirecionado para STDOUT (2>&1), o que nos permite usarwc. -
Se você precisar contar várias substituições na mesma linha separadamente, use perl novamente:
find . -name \*.php -exec \ perl -i -lpe '$l++ while s|finddddd|replaceeeee|; END{print STDERR $l}' {} + 2>&1Aqui, o próprio perl está fazendo a contagem. Observe que usei
+em vez de\;para finalizar a chamada-exec. Isso significa que ele tentará combinar os comandos com o mínimo possível. Se você não tiver muitos arquivos.php, todos eles serão passados para uma única execução deperle o número estará correto. Se você tiver muitos arquivos, isso falhará e você deverá usar isso:find . -name \*.php -exec \ perl -lpe '$l++ while s|finddddd|replaceeeee|; END{print STDERR $l}' {} + 2>&1 >/dev/null | awk '{k+=$1; }END{print k}'