jeudi 29 août 2013

SED - Filtrer du contenu entre deux chaînes pattern.

Dans Sed, il y a la possibilité de supprimer le contenu d'un fichier situé entre deux chaines de caractères. Pratique lorsque vous voulez filtrer une partie d'un fichier de manière conditionnelle. Par exemple dans le fichier suivant :

#-- Texte rigolo 

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut volutpat dui. Integer nec neque eu arcu mollis tincidunt eget et odio. Proin facilisis rutrum felis eget volutpat. Quisque et elit mi. Nunc metus libero, tempor vel interdum et, lacinia vel nisl. Nam consequat non lorem vel scelerisque. Vestibulum rutrum velit at varius semper. Nullam auctor nulla urna, eu auctor justo dictum nec. Sed luctus sem in magna dignissim, vel commodo lacus accumsan. Sed gravida nunc nec velit sagittis accumsan. Aliquam aliquet euismod venenatis. Praesent sit amet ullamcorper nisi.

%SUPPR% - Après cette ligne on supprime tout
Duis pretium sodales lacinia. Nunc est enim, dapibus et sodales sed, sagittis sed massa. Fusce vestibulum metus sit amet porttitor porta. Ut molestie eleifend faucibus. Vivamus ut urna purus. Sed aliquet volutpat lacus, in sollicitudin erat cursus vel. Sed ac lectus vel nunc consequat convallis a sit amet ante. Duis cursus malesuada sodales. Sed dictum eu ipsum sit amet luctus. Mauris facilisis pharetra quam quis varius. Nulla facilisi. Vivamus mollis porttitor convallis. Etiam aliquam, eros vitae interdum rutrum, neque turpis laoreet lacus, vel egestas arcu nisl volutpat purus. Nullam vel viverra neque.
%FINSUPPR%
Mauris euismod, augue eu sagittis commodo, massa nulla volutpat justo, at condimentum sapien arcu et ligula. Aliquam semper, enim in posuere rhoncus, libero velit semper sapien, nec convallis sapien massa mollis nisl. Ut tortor sem, consequat ac nulla at, varius tempor turpis. Morbi aliquam, ligula a sodales imperdiet, urna odio iaculis purus, non interdum sapien turpis at erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi vitae auctor nibh. In et lectus risus. Sed vitae orci erat. Cras mollis orci eget sem lobortis, vel consectetur tortor sollicitudin.

Dans sed, on peut afficher tous les caractères contenus entre deux correspondances avec la commande p. Il suffit de mettre un point d'exclamation :

sed '/%SUPPR%/,/%FINSUPPR%/!p' fichier

Explication de la commande : Pour toutes les données comprises entre %SUPPR% et %FINSUPPR% on n'imprime (p comme print) pas (négation avec le "!"). Résultat :
Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed ut volutpat dui. Integer nec neque eu arcu mollis tincidunt eget et odio. Proin facilisis rutrum felis eget volutpat. Quisque et elit mi. Nunc metus libero, tempor vel interdum et, lacinia vel nisl. Nam consequat non lorem vel scelerisque. Vestibulum rutrum velit at varius semper. Nullam auctor nulla urna, eu auctor justo dictum nec. Sed luctus sem in magna dignissim, vel commodo lacus accumsan. Sed gravida nunc nec velit sagittis accumsan. Aliquam aliquet euismod venenatis. Praesent sit amet ullamcorper nisi.

# -- ici il y avait un paragraphe, mais ça c'était avant.

Mauris euismod, augue eu sagittis commodo, massa nulla volutpat justo, at condimentum sapien arcu et ligula. Aliquam semper, enim in posuere rhoncus, libero velit semper sapien, nec convallis sapien massa mollis nisl. Ut tortor sem, consequat ac nulla at, varius tempor turpis. Morbi aliquam, ligula a sodales imperdiet, urna odio iaculis purus, non interdum sapien turpis at erat. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Morbi vitae auctor nibh. In et lectus risus. Sed vitae orci erat. Cras mollis orci eget sem lobortis, vel consectetur tortor sollicitudin.