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 -l
O truque é imprimir um
.
cada vez que um substituto for bem-sucedido e passar os resultados porwc
. O-i
flag edita o arquivo no local e o-l
faz com que uma nova linha seja adicionada a cada chamada deprint
. O-p
diz 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>&1
Aqui, 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 deperl
e 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}'