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 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

smile

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.

En ligne

#4 Le 15/02/2023, à 16:45

diesel

Re : Commande SED

kamaris a écrit :
sed '/<aliasRepositoryData>/,/<\/aliasRepositoryData>/d' gros-fichier

smile

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.

En 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

tongue

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

sputnick a écrit :

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.

En 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.

En 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.

En 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.

En 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

DébutantLinux a écrit :

,
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

diesel a écrit :

Une dernière question : Sais-tu où je pourrais trouver de la doc sur la constitution de ces xpath ?

XPath axes

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...). big_smile

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.

En ligne