Cómo hacer coincidir un patrón, eliminar el patrón y también la línea siguiente y anterior en Solaris 10

Cómo hacer coincidir un patrón, eliminar el patrón y también la línea siguiente y anterior en Solaris 10

¿Cómo puedo hacer coincidir un patrón, eliminar el patrón y también la línea anterior y siguiente en Solaris 10? Estoy chocando contra la pared porque Solaris no viene con GNU sed. Dado el siguiente contenido del archivo:

    LinearFile(3F007F106F3B, FDN, 29, 20)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
        LinearRec(1, 12345)
    }
    LinearFile(3F007F106F3C, SMS, 176, 20)
    LinearFile(3F007F106F4F, ECCP, 15, 10)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }
    LinearFile(3F007F106F42, SMSP, 43, 3)
    BinaryFile(3F007F106F43, SMSS, 2)
    LinearRec(1, 12345)

Me gustaría eliminar el bloque que contiene:

    {
      LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
    }

El archivo sería:

LinearFile(3F007F106F3B, FDN, 29, 20)
    LinearFile(3F007F106F40, XXX, 29, 1)
    {
        LinearRec(1, 12345)
    }
    LinearFile(3F007F106F3C, SMS, 176, 20)
    LinearFile(3F007F106F4F, ECCP, 15, 10)
    LinearFile(3F007F106F40, XXX, 29, 1)
    LinearFile(3F007F106F42, SMSP, 43, 3)
    BinaryFile(3F007F106F43, SMSS, 2)
    LinearRec(1, 12345)

Para eliminar la siguiente línea emití lo siguiente:

sed -e '/LinearRec(1\,\ FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/{n;d;}' file.txt

¿Qué pasa con la línea que coincide con la línea anterior?

¿Quizás se pueda lograr usando ed o vi? ¡Gracias!

Respuesta1

Aquí hay un edguión:

ed <<\!
e file.txt
/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)
-1,+1d
w newfile.txt
!

Escribe la salida en un archivo newfile.txt.


La versión repetida "global" de esto es

ed <<\!
e file.txt
g/LinearRec(1, FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF)/-1,+1d
w newfile.txt
!

Respuesta2

Un perlenfoque (suponiendo que su archivo sea lo suficientemente pequeño como para cargarlo en la memoria):

perl -0pe 's/.+?\n.*?LinearRec\(1, F{58}\).*?\n.*?\n//' file

Esto -0sorbe perltodo el archivo y le -pindica que imprima cada línea de entrada después de aplicar el script proporcionado por -e. El script en sí coincide con 58 Fsy las dos líneas circundantes y las elimina.

Respuesta3

sed -ne'$p;N;/^ *{ *\n *LinearRec(1, *FF*) *$/n;/\n/P;D' <in >out

Eso obtiene seduna vista previa de una línea y luego solo Pse imprime para generar las líneas que no se ajustan a su serie, porque salta una más y descarga el búfer cuando coincide con las dos primeras líneas.

información relacionada