Menu

Suppression d'un bloc sur detection de pattern [Résolu]

Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
-
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 !
Afficher la suite 

Votre réponse

1 réponse

Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
0
Merci
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 !
Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
> UnGnU
Messages postés
1189
Date d'inscription
lundi 2 mai 2016
Statut
Membre
Dernière intervention
17 mai 2019
-
oui, cygwin l'a. Mais ca ne fonctionne pas avec cette derniere commande.
Merci en tous cas bcp pour ton aide.
UnGnU
Messages postés
1189
Date d'inscription
lundi 2 mai 2016
Statut
Membre
Dernière intervention
17 mai 2019
164 > Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
-
Je suis assez septique sur le fait que ça ne marche pas ;-(

Testouille...

Le fichier d'origine :
$ cat fich
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5 TEST
Ligne 6 Ligne à supprimer
Ligne 7
Ligne 8
Ligne 9
Ligne 10


Test à blanc juste sur la sortie standard (l'écran) :
$ sed '/TEST/{n;d}' fich
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5 TEST
Ligne 7
Ligne 8
Ligne 9
Ligne 10


Test direct avec l'option "-i" (avec sauvegarde de l'original en le renommant en fich.BAK) :
$ sed -i.BAK '/TEST/{n;d}' fich


Vérification du contenu du fichier original (la ligne 6 a bien été supprimée) :
$ cat fich
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5 TEST
Ligne 7
Ligne 8
Ligne 9
Ligne 10


Vérification du fichier sauvegardé (le contenu est bien intact) :
$ cat fich.BAK
Ligne 1
Ligne 2
Ligne 3
Ligne 4
Ligne 5 TEST
Ligne 6 Ligne à supprimer
Ligne 7
Ligne 8
Ligne 9
Ligne 10
Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
> UnGnU
Messages postés
1189
Date d'inscription
lundi 2 mai 2016
Statut
Membre
Dernière intervention
17 mai 2019
-
Je sais pas ce que j'avais fais, mais effectivement, ca marche tres bien.
Merci encore ;-)
Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
-
Et pour supprimer uniquement la ligne suivante:
sed '/PATTERN/{n;d}' test1.xml > test41.xml
Cobalt2225
Messages postés
19
Date d'inscription
mardi 18 septembre 2018
Statut
Membre
Dernière intervention
11 décembre 2018
-
Du coup, je vais pouvoir resoudre mon probleme initial, avec un petit contournement.
Commenter la réponse de Cobalt2225