Suppression d'un bloc sur detection de pattern

Résolu
Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -  
Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   -
re-bonjour les pro,

J'ai posé une question plus tot sur ce furum qui a ete trop rapidement résolue ;-)
Du coup, je pose une question aux experts, la, ca me depasse completement.

Ce que je souhaite, c'est ceci.
J'ai un fichier xml, que nous appelerons test1.xml.

ce fichier contient un grand nombre de balise.
Par exemple :

......................
                </bin_range>
                <bin_range>
                    <from>900010</from>
                    <to>900019</to>
                    <effective_from_date>2018-09-06</effective_from_date>
                    <status>ACTIVE</status>
                </bin_range>
            </bin_ranges>
        </provider_product_consent>
<ital>        <bold><provider_product_consent>
            <code1>HC199</code1>
            <airline_code>9887</airline_code>
            <airline_name>AIRFRANCE</airline_name>
            <underline><bsp_code>ZY</bsp_code></underline>
            <product_code>F8</product_code>
            <product_name>Name3</product_name>
            <effective_from_date>2018-09-04</effective_from_date>
            <consent_type>
                <no></no>
            </consent_type>
            <provider_code>CODE</provider_code>
            <provider_name>Legal Name</provider_name>
            <bin_ranges>
                <bin_range>
                    <from>700000</from>
                    <to>749999</to>
                    <effective_from_date>2018-05-25</effective_from_date>
                    <status>ACTIVE</status>
                </bin_range>
            </bin_ranges>
        </provider_product_consent></bold></ital>
        <provider_product_consent>
            <code1>HC198</code1>
            <airline_code>9887</airline_code>
            <airline_name>AIRFRANCE</airline_name>
            <bsp_code>TO</bsp_code>
            <product_code>F8</product_code>

...................


l'objectif du script unix, probablement une commande sed, mais j'en sais rien, ce serait de :
detecter la balise : <bsp_code>ZY</bsp_code>
Si on a trouvé cette chaine de caractere, alors on supprime uniquement dans le fichier ce qui est entre les balises <provider_product_consent> qui precedent et suive le motif trouvé.

En gros, je ne supprime que la partie en italique et gras ci dessus.

Si vous avez la solution, ce serait super.

En ce moment, je m'en sort, mais c'est pas propre du tout car je passe par une bidouille sous notepad++ ...

Je vous avoue que je n'ai aucune espece d'idée de comment je peux faire.



Pour votre information, jusqu'ici, j'ai quand meme reussi a m'en sortir en utilisant Notepad++ pour marquer les balises a supprimer puis en lancant cette commande unix sur le fichier Marqué:
sed -i '/^ <provider_product_consent>MARKED/,/^ <\/provider_product_consent>MARKED/d' test1.xml

Mais c'est pas beau !
A voir également:

1 réponse

Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Bonjour les zamis,

Je pense pouvoir m'en sortir si j'arrive a trouver la commande qui permet de ne supprimer que la ligne precedent un motif specifique.

Pour le moment, j'ai pu tester cette commande :
sed -n '$p;N;/PATTERN/{d};P;D;' test1.xml

cette commande supprime la ligne ou le motif PATTERN est trouvé ainsi que la précédente.

=> Mon objectif, c'est de ne supprimer que la precedente, pas la ligne avec PATTERN.

et si vous avez un commande qui permet de ne supprimer que la ligne Suivante du PATTERN trouvé, alors, vous me sauvez la vie ;-)

Merci !
0
Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Bon, ben, je vais m'auto répondre vu que j'ai fini par trouver la commande pour la ligne précédente uniquement:
sed -n '/PATTERN/{d};P;D;' test1.xml > test41.xml

bon, reste plus qu'a trouver pour la ligne suivante ;-)

PS : Je sens que je vais aussi m'auto repondre pour le coup.
0
Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Et pour supprimer uniquement la ligne suivante:
sed '/PATTERN/{n;d}' test1.xml > test41.xml
0
Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Du coup, je vais pouvoir resoudre mon probleme initial, avec un petit contournement.
0
UnGnU Messages postés 1158 Date d'inscription   Statut Contributeur Dernière intervention   158 > Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention  
 
Salut,
Bon, ben, je vais m'auto répondre vu que j'ai fini par trouver la commande pour la ligne précédente uniquement:
sed -n '/PATTERN/{d};P;D;' test1.xml > test41.xml
La commande
sed -n '/PATTERN/{d};P;D;' test1.xml
ne supprime pas la ligne précédente, mais uniquement la ligne contenant le "PATTERN" ;-(

Voila une solution avec "ed" pour supprimer conjointement la ligne précédente et la ligne suivante d'un PATTERN donné sans toucher audit PATTERN :

$ cat f1
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5 TEST
Ligne 6
Ligne 7
Ligne 8
Ligne 9
Ligne 10


$ ed -s f1 <<<$'/TEST/-1d\n/TEST/+1d\n,p'
Ligne 1
Ligne 2
Ligne 3
Ligne 5 TEST
Ligne 7
Ligne 8
Ligne 9
Ligne 10
0
Cobalt2225 Messages postés 19 Date d'inscription   Statut Membre Dernière intervention   > UnGnU Messages postés 1158 Date d'inscription   Statut Contributeur Dernière intervention  
 
Tu as entierement raison, j'etais en train de re-galerer sur le sujet... pour corriger mon post.
y aurait il moyen de trouver une reponse avec sed, car je n'ai pas la commande ed dans mon emulateur shell que j'utilise (cygwin)...

par contre, la commande de suppression uniquement de la ligne suivante fonctionne bien.
0