Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 02/10/2014, à 10:04

iuchiban

[SED] Ajouter un bloc de texte après un match suivi d'un non match

Bonjour tout le monde,

encore un petit soucis de sed.
Sur des fichiers xml, j'ai besoin d'ajouter un bloc de texte (contenant des options) si j'ai une ligne qui match un pattern suivie d'une ligne qui ne match pas un autre pattern.

si j'ai <connection-factory, et que la ligne suivante n'est pas <connection-properties, j'ajoute un bloc de texte.

Exemple :
Fichier de départ :

   <connection-pool name="jdbc/pool01" max-connect-attempts="2" max-connections="10" min-connections="1" num-cached-statements="200">
      <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="user01" password="password01" url="jdbc:oracle:thin:@Oracle_SID_01" commit-record-table-name="">
         <connection-properties>
            <property name="implicitCachingEnabled" value="true"/>
            <property name="oracle.jdbc.FreeMemoryOnEnterImplicitCache" value="true"/>
            <property name="v$session.program" value="__VALUE__"/>
         </connection-properties>
      </connection-factory>
   </connection-pool>
   <connection-pool name="jdbc/pool02" max-connect-attempts="2" max-connections="10" min-connections="1" num-cached-statements="200">
      <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="user02" password="password02" url="jdbc:oracle:thin:@Oracle_SID_02" commit-record-table-name=""/>
   </connection-pool>

Après passage de sed devient :

   <connection-pool name="jdbc/pool01" max-connect-attempts="2" max-connections="10" min-connections="1" num-cached-statements="200">
      <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="user01" password="password01" url="jdbc:oracle:thin:@Oracle_SID_01" commit-record-table-name="">
         <connection-properties>
            <property name="implicitCachingEnabled" value="true"/>
            <property name="oracle.jdbc.FreeMemoryOnEnterImplicitCache" value="true"/>
            <property name="v$session.program" value="__VALUE_01__"/>
         </connection-properties>
      </connection-factory>
   </connection-pool>
   <connection-pool name="jdbc/pool02" max-connect-attempts="2" max-connections="10" min-connections="1" num-cached-statements="200">
      <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="user02" password="password02" url="jdbc:oracle:thin:@Oracle_SID_02" commit-record-table-name=""/>
         <connection-properties>
            <property name="implicitCachingEnabled" value="true"/>
            <property name="oracle.jdbc.FreeMemoryOnEnterImplicitCache" value="true"/>
            <property name="v$session.program" value="__VALUE_02__"/>
         </connection-properties>
   </connection-pool>

Mon bloc de texte a ajouter est stocké dans un fichier texte.

Merci d'avance à toutes vos propositions smile


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#2 Le 02/10/2014, à 16:18

Postmortem

Re : [SED] Ajouter un bloc de texte après un match suivi d'un non match

Salut,

$ cat fic
   <connection-pool name="jdbc/pool01" max-connect-attempts="2" max-connections="10" min-connections="1" num-cached-statements="200">
      <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="user01" password="password01" url="jdbc:oracle:thin:@Oracle_SID_01" commit-record-table-name="">
         <connection-properties>
            <property name="implicitCachingEnabled" value="true"/>
            <property name="oracle.jdbc.FreeMemoryOnEnterImplicitCache" value="true"/>
            <property name="v$session.program" value="__VALUE__"/>
         </connection-properties>
      </connection-factory>
   </connection-pool>
   <connection-pool name="jdbc/pool02" max-connect-attempts="2" max-connections="10" min-connections="1" num-cached-statements="200">
      <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="user02" password="password02" url="jdbc:oracle:thin:@Oracle_SID_02" commit-record-table-name=""/>
   </connection-pool>
$ sed '/<connection-factory/ {N; /\n *<connection-properties/! s#\(\n.*\)#\n         <connection-properties>\n            <property name="implicitCachingEnabled" value="true"/>\n            <property name="oracle.jdbc.FreeMemoryOnEnterImplicitCache" value="true"/>\n            <property name="v$session.program" value="__VALUE_02__"/>\n         </connection-properties>\1#}' fic > fic2
$ cat fic2
   <connection-pool name="jdbc/pool01" max-connect-attempts="2" max-connections="10" min-connections="1" num-cached-statements="200">
      <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="user01" password="password01" url="jdbc:oracle:thin:@Oracle_SID_01" commit-record-table-name="">
         <connection-properties>
            <property name="implicitCachingEnabled" value="true"/>
            <property name="oracle.jdbc.FreeMemoryOnEnterImplicitCache" value="true"/>
            <property name="v$session.program" value="__VALUE__"/>
         </connection-properties>
      </connection-factory>
   </connection-pool>
   <connection-pool name="jdbc/pool02" max-connect-attempts="2" max-connections="10" min-connections="1" num-cached-statements="200">
      <connection-factory factory-class="oracle.jdbc.pool.OracleDataSource" user="user02" password="password02" url="jdbc:oracle:thin:@Oracle_SID_02" commit-record-table-name=""/>
         <connection-properties>
            <property name="implicitCachingEnabled" value="true"/>
            <property name="oracle.jdbc.FreeMemoryOnEnterImplicitCache" value="true"/>
            <property name="v$session.program" value="__VALUE_02__"/>
         </connection-properties>
   </connection-pool>

Dernière modification par Postmortem (Le 02/10/2014, à 16:18)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#3 Le 03/10/2014, à 09:16

iuchiban

Re : [SED] Ajouter un bloc de texte après un match suivi d'un non match

Merci Postmortem c'est exactement ce qu'il me fallait, je vais pouvoir automatiser mes modifs sur mes serveurs de Prod smile


C'est depuis que Chuck Norris a laissé la vie sauve à un manchot que l'on dit que Linux est libre.

Chuck Norris n'a pas besoin d'éditer son premier message pour ajouter [Résolu]. Chuck Norris est toujours [Résolu], quoi qu'il arrive.

Hors ligne

#4 Le 08/10/2014, à 10:29

nesthib

Re : [SED] Ajouter un bloc de texte après un match suivi d'un non match

Attention, utiliser des expression rationnelles pour travailler sur un langage balisé n'est pas une bonne solution (risque d'erreur, faux négatifs…) wink
Il vaut mieux utiliser un parseur qui comprend la grammaire du langage. Un exemple avec beautifulsoup en python :

from bs4 import BeautifulSoup  # python3
# from BeautifulSoup import BeautifulSoup  # python2

with open('/tmp/fichier') as f:
    soup = BeautifulSoup(f.read())

soup.findAll(lambda tag: tag.name=='connection-pool' and tag.findChild('connection-properties'))

Ce n'est qu'un exemple. Ici, rien n'est modifié et par défaut le fichier est considéré comme du html, mais c'est juste pour illustrer la démarche wink
Attention lorsque tu utilises des expression rationnelles de bien faire des vérifications sur l'intégrité du fichier.


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne