substitui a correspondência por uma referência anterior por uma string em sed

1

Estou tentando criar um script sed para modificar os construtores em algumas centenas de arquivos php do estilo php4 para o estilo php5. Eu estou fazendo algum progresso, mas estou tendo um problema em obter as referências de volta do sed. Aqui está um arquivo de exemplo:

<?php

class Dashboard extends CI_Controller {

    function Dashboard()
    {
        parent::Controller();   
    }
}

O objetivo é pegar o nome da classe da primeira linha (que terá 0 ou 1 linhas em branco entre ele e o

Isso funciona como esperado:

sed -En '/^class\ ([a-zA-Z0-9]+)/ {
    n;H;x;n;H;x;'s/Dash/Derp/';P
}' dashtest.php

Dando a saída:

function Derpboard()

Mas por que isso não substitui o Dashboard pela __construct?:

sed -En '/^class\ ([a-zA-Z0-9]+)/ {
    n;H;x;n;H;x;'s//__construct/';P
}' dashtest.php

Qualquer outro conselho sobre isso seria bem-vindo. Minha intenção é envolver isso em um shell script que está fazendo um monte de outras mudanças migrando de uma versão antiga do framework codeIgnitor php para a versão atual.

    
por The Naumannator 21.10.2013 / 21:04

1 resposta

0

O ' que você tem antes de s/… sair do modo de cota única, fazendo com que todo o s//__construct/ (até o próximo ' ) seja analisado como sem aspas pelo seu shell . Neste modo, é traduzido para apenas 1 , então sed acaba recebendo s/1/__construct/ .

Note que isso não funcionaria de qualquer maneira , porque backreferences em expressões regulares POSIX usadas por sed só podem se referir a grupos dentro do mesmo regexp, e sed não tem uma sintaxe especial para usar correspondências anteriores.

Você precisaria de algo mais avançado - por exemplo:

perl -pe '
    if (/^class (\w+)/) {
        $class = $1;
    }
    elsif (/^\}$/) {
        $class = "";
    }
    elsif ($class and /function \Q$class\E\(/) {
        s//function __construct(/;
    }
'
    
por 21.10.2013 / 21:41

Tags