(L) unix – scission puis filtrage, envoi du résultat à stdout

Je ne peux pas sembler trouver un bon moyen de le faire en utilisant les commandes Unix / Linux (sans écrire un script). Je pense que cela peut être fait, cependant.

Ce que je veux faire est de lire le contenu d’un fichier, de le séparer par un délimiteur, puis de supprimer les segments qui ne correspondent pas à un RegEx (essentiellement, un problème de réduction de filtre de carte).

quelque chose comme

cat original-file.sql | split --separator=';' | pcregrep -M '(.|\n)*needed_schema(.|\n)*' | result-file.sql 

de sorte que le fichier de résultats ne contienne que des instructions SQL incluant “needed_schema” dans l’instruction.

original-file.sql

 SELECT * FROM information_schema.tables WHERE table_schema = 'public' ; SELECT * FROM needed_schema.some_table WHERE some_col = 'some value' ; SELECT * FROM needed_schema.some_other_table WHERE some_other_col = 'some other value' ; 

fichier-résultat.sql

 SELECT * FROM needed_schema.some_table WHERE some_col = 'some value' ; SELECT * FROM needed_schema.some_other_table WHERE some_other_col = 'some other value' ; 

Pensez à utiliser awk et à assigner RS (Record Separator) et ORS (Output Record Separator):

 $ awk '/needed_schema/' RS=';' ORS=';' input SELECT * FROM needed_schema.some_table WHERE some_col = 'some value' ; SELECT * FROM needed_schema.some_other_table WHERE some_other_col = 'some other value' ; 

Le regex n’est pas PCRE mais l’expression régulière étendue