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.
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 quegrep
no soporta la banderaU
para habilitar la búsqueda no codiciosa. Esto significa que encontrará la mayor cantidad posible de coincidencias, incluyendo múltiples declaracionesCREATE 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.