#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
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
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…)
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
Attention lorsque tu utilises des expression rationnelles de bien faire des vérifications sur l'intégrité du fichier.
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde auto – ♥ awk
⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn
Hors ligne