es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Grupo de captura regex con grep.

Estoy intentando capturar el SQL DDL “CREATE” de un volcado de esquema de PostgreSQL que se ve así:

SET default_table access_method = heap;

CREATE TABLE schema_name.table_name (
    col1 bigint,
    col2 text
);

ALTER TABLE schema_name.table_name OWNER TO user;

CREATE INDEX index ON schema_name.table_name USING btree (col1);

Lo que quiero es:

CREATE TABLE schema_name.table_name (
    col1 bigint,
    col2 text
);`

¿Por qué grep -Po "(CREATE TABLE)[\S\s]*(;)" dump.sql no está funcionando?

En PCRE2, /CREATE TABLE [\w]*\.[\w]*[\S\s]*(;)/U coincide correctamente.

Gracias.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    El comando grep -Po utiliza expresiones regulares en Perl para buscar patrones en el archivo de entrada. Si bien el patrón regex utilizado ((CREATE TABLE) [\S\s]*(;)) parece estar correctamente formado, el problema es que grep no soporta la bandera U para habilitar la búsqueda no codiciosa. Esto significa que encontrará la mayor cantidad posible de coincidencias, incluyendo múltiples declaraciones CREATE TABLE si están presentes en el archivo de entrada.

    El uso del patrón regex de PCRE2 /CREATE TABLE [\w]*\.[\w]* [\S\s]*(;)/U habilita la búsqueda no codiciosa y resuelve este problema.

Comments are closed.