Pages : 1
#1 Le 15/02/2023, à 16:00
- DébutantLinux
Commande SED
Bonjour,
J'ai un gros fichier texte dans lequel je souhaite supprimer toutes les lignes ayant le contenu suivant.
Il me semble que sed devrait pouvoir faire le job mais impossible de trouver la commande par moi même.
Qui peu m'aider ?
A noter que les 1 indiqués dans mon exemple ont parfois une autre valeur.
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<aliasId>1</aliasId>
</aliasRepositoryData>
Merci beaucoup
Hors ligne
#2 Le 15/02/2023, à 16:39
- kamaris
Re : Commande SED
sed '/<aliasRepositoryData>/,/<\/aliasRepositoryData>/d' gros-fichier
Hors ligne
#3 Le 15/02/2023, à 16:42
- diesel
Re : Commande SED
Est-ce que tu veux supprimer TOUTES les lignes comportant les chaînes de caractères "aliasRepositoryData", "serviceIndId", "version" et "aliasId" ou est-ce que c'est plus fin que ça ?
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#4 Le 15/02/2023, à 16:45
- diesel
Re : Commande SED
sed '/<aliasRepositoryData>/,/<\/aliasRepositoryData>/d' gros-fichier
Oui...,
Mais s'il a des lignes :
<aliasRepositoryData>
<autrechose>encore autre chose</autrechose>
</aliasRepositoryData>
tu vas supprimer les lignes "<autrechose>encore autre chose</autrechose>" qui n'avaient pas vocation à être supprimées.
De toutes manières, le problème n'est pas assez bien posé.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#5 Le 15/02/2023, à 17:09
- DébutantLinux
Re : Commande SED
Grand merci pour vos réponses rapides
Effectivement mon problème n'est pas très bien spécifié et est un peu plus complexe :
En fait, j'ai 2 cas de figure, la différence se faisant sur la présence ou pas de la balise asData
1) Tout le bloc est à supprimer
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version> où valeur = 1 à 100
<aliasId>1</aliasId> où valeur = 1 à 100
</aliasRepositoryData>
1) Tout le bloc est à conserver
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version> où valeur = 1 à 100
<asData>azertyuiollkkjhgfgcdchgccc</asData> où valeur = contenu très variable
<aliasId>1</aliasId> où valeur = 1 à 100
</aliasRepositoryData>
Une nouvelle fois, merci pour votre aide
Hors ligne
#6 Le 15/02/2023, à 17:42
- kamaris
Re : Commande SED
sed -n '/<aliasRepositoryData>/,/<\/aliasRepositoryData>/{/<aliasRepositoryData>/{h; d}; H; /<\/aliasRepositoryData>/{g; /<asData>/!d; p}; d}; p' gros-fichier
Dernière modification par kamaris (Le 15/02/2023, à 17:44)
Hors ligne
#7 Le 15/02/2023, à 21:32
- sputnick
Re : Commande SED
On ne parse pas du XML/HTML avec sed. Plutot utiliser un parser XML/HTML comme xmlstarlet:
cat file.xml
<root>
<foo>
<p>coucou</p>
</foo>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<aliasId>1</aliasId>
</aliasRepositoryData>
</root>
$ xmlstarlet edit -d '//aliasRepositoryData' file.xml
<?xml version="1.0"?>
<root>
<foo>
<p>coucou</p>
</foo>
</root>
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#8 Le 16/02/2023, à 08:55
- diesel
Re : Commande SED
On ne parse pas du XML/HTML avec sed. Plutot utiliser un parser XML/HTML comme xmlstarlet:
Oui...,
Sauf que dans le cas présent, ça ne répond pas au problème posé.
Cela dit, s'il y a une solution avec xmlstartlet, je serais très intéressé de la voir.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 16/02/2023, à 09:13)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#9 Le 16/02/2023, à 10:34
- DébutantLinux
Re : Commande SED
Bonjour à tous,
Effectivement, l'utilisation de xmlstartlet ou de tout autre outil à installer n'est pas possible.
Je travaille sur des serveurs Telecom, excessivement sécurisés.
Ce que j'ai partagé est une toute partie de profils mobile, cad comment on est déclaré en tant qu'abonné à un service de téléphonie mobile.
Il me faut modifier le fichier source (ce que j'ai partagé) pour le mettre en input d'un outil interne qui va modifier certains attributs avant de l'injecter dans les serveurs de l’opérateur en question.
Merci de votre aide
Hors ligne
#10 Le 16/02/2023, à 12:11
- sputnick
Re : Commande SED
Voici la commande xmlstarlet qui marche dans tes 2 cs de figures:
xmlstarlet ed -d '//aliasRepositoryData[not(//asData)]' file.xml
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#11 Le 16/02/2023, à 12:25
- diesel
Re : Commande SED
Merci Sputnik. Je vais étudier ça avec attention.
Alors, j'ai essayé : Marche pô.
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 16/02/2023, à 12:33)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#12 Le 16/02/2023, à 12:39
- sputnick
Re : Commande SED
$ cat file.xml
<root>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<aliasId>1</aliasId>
</aliasRepositoryData>
</root>
$ xmlstarlet ed -d '//aliasRepositoryData[not(//asData)]' file.xml
<?xml version="1.0"?>
<root/>
$ cat file2.xml
<root>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<asData>azertyuiollkkjhgfgcdchgccc</asData>
<aliasId>1</aliasId>
</aliasRepositoryData>
</root>
$ xmlstarlet ed -d '//aliasRepositoryData[not(//asData)]' file2.xml
<?xml version="1.0"?>
<root>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<asData>azertyuiollkkjhgfgcdchgccc</asData>
<aliasId>1</aliasId>
</aliasRepositoryData>
</root>
$
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#13 Le 16/02/2023, à 12:51
- diesel
Re : Commande SED
Ben, ça alors !
jean-marie@jean-marie:~$ cat toto.xml
<?xml version="1.0"?>
<root>
<foo>
<p>coucou</p>
</foo>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<asData>nbvcxwmlkjhgfdsqpoiuytreza</asData>
<aliasId>10</aliasId>
</aliasRepositoryData>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<aliasId>1</aliasId>
</aliasRepositoryData>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<asData>azertyuiollkkjhgfgcdchgccc</asData>
<aliasId>2</aliasId>
</aliasRepositoryData>
</root>
jean-marie@jean-marie:~$ xmlstarlet ed -d '//aliasRepositoryData[not(//asData)]' toto.xml
<?xml version="1.0"?>
<root>
<foo>
<p>coucou</p>
</foo>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<asData>nbvcxwmlkjhgfdsqpoiuytreza</asData>
<aliasId>10</aliasId>
</aliasRepositoryData>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<aliasId>1</aliasId>
</aliasRepositoryData>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<asData>azertyuiollkkjhgfgcdchgccc</asData>
<aliasId>2</aliasId>
</aliasRepositoryData>
</root>
jean-marie@jean-marie:~$
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#14 Le 16/02/2023, à 13:11
- sputnick
Re : Commande SED
Ayé, corrigé le XPath:
$ xmlstarlet ed -d '//aliasRepositoryData[not(./asData)]' /tmp/file.xml
<?xml version="1.0"?>
<root>
<foo>
<p>coucou</p>
</foo>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<asData>nbvcxwmlkjhgfdsqpoiuytreza</asData>
<aliasId>10</aliasId>
</aliasRepositoryData>
<aliasRepositoryData>
<serviceIndId>CTS_HISTORY</serviceIndId>
<version>1</version>
<asData>azertyuiollkkjhgfgcdchgccc</asData>
<aliasId>2</aliasId>
</aliasRepositoryData>
</root>
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#15 Le 16/02/2023, à 13:42
- diesel
Re : Commande SED
Super ! Ça marche.
Une dernière question : Sais-tu où je pourrais trouver de la doc sur la constitution de ces xpath ?
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#16 Le 16/02/2023, à 16:44
- DébutantLinux
Re : Commande SED
Bonjour,
J'ai finalement trouvé une solution à mon problème grâce à sed -z ..........
La commande est plus compliquée que celle proposée par sputnick mais il m'est impossible et interdit d’installer quoique ce soit (xmlstarlet en l’occurrence) sur mes serveurs.
Merci à tous
Hors ligne
#17 Le 16/02/2023, à 17:52
- kamaris
Re : Commande SED
Celle que j'avais donnée plus haut ne marchait pas ? https://forum.ubuntu-fr.org/viewtopic.p … #p22650180
Hors ligne
#18 Le 16/02/2023, à 18:56
- sputnick
Re : Commande SED
,
La commande est plus compliquée que celle proposée par sputnick mais il m'est impossible et interdit d’installer quoique ce soit (xmlstarlet en l’occurrence) sur mes serveurs.
Qui/quelle entreprise oblige ses employés à utiliser les mauvais outils? On est plus en 1985. Si tu demande gentiment aux SysAdmin, je suis sur qu'il te laissera installer xmlstarlet. Sinon, tu peux aussi utiliser Perl en installant un module comme XML::LibXml
Une dernière question : Sais-tu où je pourrais trouver de la doc sur la constitution de ces xpath ?
Différents outils Unix à avoir dans le 'toolchest' (post que j'ai écrit il y a 10 ans) https://stackoverflow.com/questions/160 … 2#16090892
https://developer.mozilla.org/en-US/docs/Web/XPath
http://www.balisage.net/Proceedings/vol … hev01.html
http://www.w3schools.com/xpath/xpath_functions.asp
http://stackoverflow.com/tags/xpath/info
http://www.w3.org/TR/xpath/ ### xmlstarlet est en XPath1
https://www.w3.org/TR/xpath20/ ### avec xidel seulement https://www.videlibri.de/xidel.html
http://www.w3.org/TR/xpath-30/ ### idem avec xidel
http://en.wikipedia.org/wiki/XPath
http://www.zvon.org/xxl/XPathTutorial/
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#19 Le 16/02/2023, à 19:43
- diesel
Re : Commande SED
Merci mille fois Sputnik.
On en reparle quand j'aurai fini de digérer tout ça (dans 6 mois, quoi...).
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 16/02/2023, à 19:43)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
Pages : 1