
Quiero extraer sólo las líneas que restaurarán una tabla específica desde un archivo de copia de seguridad de MySQL. Lo siguiente funciona.
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/p' > account_codes.sql
Sin embargo, el archivo de copia de seguridad tiene un tamaño de 9 GB, por lo que me gustaría dejar de buscar una vez que se haya encontrado la coincidencia final. Entonces, en la parte sed del comando anterior podría agregar {p;q} en lugar de p al final de esta manera:
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;q}' > account_codes.sql
Eso se detiene, pero después de la coincidencia "desde", no de la coincidencia "hasta". Básicamente, la salida es solo la primera línea de todo el bloque.
DROP TABLE IF EXISTS `account_codes`;
¿Cómo puedo solucionar este problema para que el q
comando solo tenga efecto al final del patrón coincidente?
Respuesta1
encontréesta publicación, que utilicé para modificar mi comando sed de la siguiente manera:
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/UNLOCK TABLES/q}' > account_codes.sql
Básicamente, le dice a sed que busque las líneas coincidentes y luego salga cuando encuentre la siguiente cadena "UNLOCK TABLES" en el archivo.
En el archivo de copia de seguridad de MySQL, "UNLOCK TABLES;" seguido de (por ejemplo)
--
-- Table structure for table `account_table`
--
Sin embargo, si modifico el comando sed de la siguiente manera
zcat /mnt/backup/full-replication.gz | sed -n -e '/DROP TABLE.*`account_codes`/,/UNLOCK TABLES/{p;/-- Table structure for table/q}' > account_codes.sql
sed no se detiene cuando encuentra esa cadena. No tengo suficiente experiencia con sed para entender por qué no. ¿Quizás alguien pueda dejar un comentario para aclarar esto?