[Rio-pm] In place editing recursivo

breno breno em rio.pm.org
Segunda Junho 8 20:08:37 PDT 2009


2009/6/8 Donato Azevedo <donatoaz em gmail.com>:
>>>
>>> perl -MFile::Find "find( sub { print if /\.fdf$/i }, '.' )" | perl
>>> -pi.bak -e "s/CA/CB/g"
>>>
>>> alguem sabe o que ta errado, ou mesmo se é possível fazer algo estilo
>>> golf pra isso?
>>

Bom, vejo três problemas aí. O primeiro é que as respostas são dadas
com print puro então vem sem espaço ou quebra de linha. Isso é
facilmente resolvido com o -l. Já o segundo é q o find simples vai
retornar apenas o nome do arquivo, o que impossibilita encontrá-lo
pelo outro script. Para obter o caminho junto com o arquivo (e pulando
linha), vc precisa substituir a primeira parte por algo como:

perl -MFile::Find -le 'find({wanted => sub{print if /\.fdf$/i},
no_chdir => 1 },q{.})'

O terceiro problema é que, ao alimentar por pipe um one-liner que faz
-p, é como se vc quisesse modificar esse conteúdo, e não passar
arquivos que deveriam ser abertos e ter o conteúdo modificado (que
acredito ser o q vc quer), como ocorre qdo passamos a lista de
arquivos no final.

A solução mais óbvia que encontrei foi inverter a ordem dos oneliners
e usando a sintaxe shell de crase `` para indicar "pegue a saida disso
e passe para o primeiro comando". Ficou assim:

 perl -i.bak -pe 's/CA/CB/g' `perl -MFile::Find -le 'find({wanted =>
sub{print if /\.fdf$/i}, no_chdir => 1 },q{.})'`

Mas não tenho idéia de como fazer isso em win32...


[]s

-b


Mais detalhes sobre a lista de discussão Rio-pm