Altera algum código ASP para código PHP em todos os arquivos

2

Estou migrando um diretório de arquivos contendo código ASP bastante simples para um servidor PHP e preciso modificar o conteúdo de todos os arquivos com um mecanismo de localização e substituição. Não sou muito bom com expressões regulares, mas já usei isso para alterar algumas coisas:

find . -name "*.php" -print0 | xargs -0 -n 1 sed -i -e 's/oldstring/newstring/g'

Eu tenho algumas cadeias complexas que eu preciso substituir embora. Veja o seguinte:

DE:

<% if request("page") = "" then %>

PARA:

<?php if(!isset($_GET['page']) || !$_GET['page']){ ?>

Este, o * pode ser qualquer número, então mantenha esse número onde o * está no "PARA".

DE:

<% elseif request("page") = "*" then %>

PARA:

<?php } elseif($_GET['page'] == '*'){ ?>

E o último é bem simples. FROM:

<% end if %>

PARA:

<?php } ?>

Se eu puder executar isso em massa, recursivamente em um diretório, isso consertará 98% de todo o código ASP nesses arquivos. Eu tentei escapar dessas cadeias de várias maneiras, mas não consigo descobrir como fazê-lo funcionar. Qualquer ajuda é apreciada!

    
por solepixel 09.06.2013 / 22:49

1 resposta

0

Existem várias maneiras de fazer isso, eu recomendo aproveitar a função quotemeta do Perl

Primeiro, crie um arquivo de texto separado por guias contendo os padrões de pesquisa na primeira coluna e seus substitutos no segundo:

$ cat pats.txt                     
<% if request("page") = "" then %>  <?php if(!isset($_GET['page']) || !$_GET['page']){ ?>
<% elseif request("page") = "*" then %> <?php } elseif($_GET['page'] == '*'){ ?>
<% end if %>    <?php } ?>

Eu criei um arquivo de teste cujo conteúdo é:

$ cat foo.asp 
<% if request("page") = "" then %>
<% elseif request("page") = "*" then %>
<% end if %>

E Perl para o resgate:

find . -name "*.php" | while IFS= read -r file; do
  perl -i.bak -e 'open(A,"pats.txt");
             while(<A>){chomp; @a=split(/\t/); $k{quotemeta($a[0])}=$a[1]}
             while(<>){ 
              foreach $pat (keys(%k)){
                s/$pat/$k{$pat}/;
              } 
             print}' $file;
done

-i flag do Perl funciona como em sed , você pode especificar um sufixo de backup opcional. No exemplo acima, um arquivo chamado foo.php.bak será criado para cada arquivo processado. Use -i sozinho se você não quiser os backups.

EXPLICAÇÃO:

O script lerá os padrões e substituições e salvará os padrões como chaves de um hash ( %k ) onde as substituições são os valores. A função quotemeta escapa de todos os caracteres não ASCII (não correspondentes a [A-Za-z_0-9] ).

O script abre o segundo arquivo, procura cada padrão em cada linha e substitui de acordo. Como os padrões de pesquisa foram ignorados por quotemeta , eles são reconhecidos corretamente.

NOTAS

Esta não é, obviamente, a maneira mais eficiente de fazer isso, pois terá que procurar cada um dos padrões em cada linha. Ainda assim, funciona e é muito mais simples do que tentar escapar manualmente de tudo.

O script falhará nos arquivos com novas linhas nos nomes. Eu suponho que isso não será um problema aqui.

    
por 10.06.2013 / 00:08