reemplace la coincidencia con una referencia inversa con una cadena en sed

1

Estoy tratando de crear un script sed para modificar los constructores en un par de cientos de archivos php del estilo php4 al estilo php5. Estoy progresando, pero tengo un problema para sacar las referencias de sed. Aquí hay un archivo de ejemplo:

<?php

class Dashboard extends CI_Controller {

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

El objetivo es tomar el nombre de la clase desde la primera línea (que tendrá 0 o 1 líneas en blanco entre él y el

Esto funciona como se esperaba:

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

Dando la salida:

function Derpboard()

Pero, ¿por qué esto no reemplaza Dashboard con __construct ?:

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

Cualquier otro consejo sobre esto sería bienvenido. Mi intención es envolver esto en un script de shell que está haciendo un montón de otros cambios al migrar desde una versión antigua de codeIgnitor php framework a la versión actual.

El naumannator
fuente

Respuestas:

0

El 'que tiene justo antes s/…sale del modo de comillas simples, lo que hace que todo s/\1/__construct/(hasta el siguiente ') se analice como no citado por su shell. En este modo, \1se traduce a just 1, por lo que sed termina recibiendo s/1/__construct/.

Tenga en cuenta que esto no funcionaría de todos modos , porque las referencias posteriores en las expresiones regulares POSIX utilizadas por sed solo pueden referirse a grupos dentro de la misma expresión regular, y sed no tiene una sintaxis especial para usar coincidencias anteriores.

Necesitaría algo más avanzado, por ejemplo:

perl -pe '
    if (/^class (\w+)/) {
        $class = $1;
    }
    elsif (/^\}$/) {
        $class = "";
    }
    elsif ($class and /function \Q$class\E\(/) {
        s//function __construct(/;
    }
'
Gravedad
fuente
Veo. Tenía la esperanza de perfeccionar mi sed-fu bastante carente con esta tarea, pero parece que iré a repasar a Perl. Este ejemplo es solo la primera de varias modificaciones que tendré que hacer, y definitivamente tendré que almacenar algunas coincidencias para su uso posterior. Gracias.
The Naumannator