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.