[Rio-pm] In place editing recursivo

Donato Azevedo donatoaz em gmail.com
Terça Junho 9 07:38:03 PDT 2009


2009/6/9 breno <breno em rio.pm.org>:
> 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...

Bem, eu fiz o seguinte, e resolveu...

C:\> perl -MFile::Find::Rule -i.bak -e
"@ARGV=File::Find::Rule->file()->name(qq{*.fdf})->in(qw{.});
s/CA/CB/gi, print while(<>);"

eu tive a idéia no perldoc perlop na parte de I/O Operators

Cheers!
-- 
Donato Azevedo


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