¿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 ed
guió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 perl
enfoque (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 -0
sorbe perl
todo el archivo y le -p
indica que imprima cada línea de entrada después de aplicar el script proporcionado por -e
. El script en sí coincide con 58 F
sy 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 sed
una vista previa de una línea y luego solo P
se 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.