#1 Le 31/01/2015, à 11:53
- Zococo
[Résolu]sed - insérer une tabulation en début de ligne
Bonjour
Je souhaite remettre en forme un certain nombre de fichiers fournis sous la forme suivante :
<balise1><balise2>texte</balise2><balise2>texte</balise2><balise2>texte</balise2><balise2>texte</balise2></balise1>
<balise1><balise2>texte</balise2><balise2>texte</balise2></balise1>
<balise1><balise2>texte</balise2><balise2>texte</balise2><balise2>texte</balise2></balise1>
et obtenir le résultat très classique suivant :
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1>
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1>
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1>
J'ai trop de fichiers et ils sont trop longs pour le faire dans un éditeur de texte (plusieurs minutes de traitement avec gedit pour un seul fichier) et de toutes façons le faire à l'unité est pénible ; cependant le nombre de balises est limité, le nombre d'opérations à effectuer est peu élevé et par conséquent je ne trouve pas utile de faire appel à un traitement plus évolué (langage de programmation) qui semble plus agile pour faire du parsing.
J'ai trouvé des commandes sed qui fonctionnent assez bien pour insérer des retour à la ligne mais pas pour les tabulations.
Avec la commande :
sed -i 's/><balise2/>\n\t<balise2>/g' $fichier
sed -i 's/><\/balise2/>\n\t<\/balise2>/g' $fichier
voici ce que j'obtiens :
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1>
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1>
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1>
Il y a des tas de scripts pour supprimer des espaces et des tabulations en début de ligne mais pour en ajouter je n'ai pas trouvé.
Pouvez-vous m'aider ? Par avance merci.
Dernière modification par Zococo (Le 02/02/2015, à 22:56)
Ubuntu 23.04 (64 bits) - Gigabyte B250M-DS3H / Core i5-7600K (Kaby lake) - Microsoft surface Go 3
Hors ligne
#2 Le 31/01/2015, à 12:11
- Zococo
Re : [Résolu]sed - insérer une tabulation en début de ligne
Re()
Je viens de trouver une solution qui fonctionne mais ne résout rien au fond :
sed -i 's/><balise2/>\nTAB_<balise2>/g' $fichier
sed -i 's/><\/balise2/>\nTAB_<\/balise2>/g' $fichier
sed -i 's/TAB_/\t/g'
J'insère un motif quelconque sans tabulation puis je substitue in fine le motif par \t. Deux mauvais point :
- un traitement supplémentaire (pour mon cas ça ira)
- ne m'explique toujours pas pourquoi la commande initiale n'a pas fonctionné.
Donc si vous avez une idée, je reste intéressé...
Ubuntu 23.04 (64 bits) - Gigabyte B250M-DS3H / Core i5-7600K (Kaby lake) - Microsoft surface Go 3
Hors ligne
#3 Le 31/01/2015, à 12:28
- pingouinux
Re : [Résolu]sed - insérer une tabulation en début de ligne
Bonjour,
Avec ton fichier de départ, et cette commande
sed -ri 's#(<balise2>)#\n\t\1\n\t\t#g;s#(</balise2>)#\n\t\1\n#g' $fichier
j'obtiens ceci
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1>
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1>
<balise1>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
<balise2>
texte
</balise2>
</balise1
Qu'est-ce que tu utilises comme shell ? J'ai testé avec bash et sh.
Hors ligne
#4 Le 31/01/2015, à 13:44
- tiramiseb
Re : [Résolu]sed - insérer une tabulation en début de ligne
Salut,
Plutôt que de t'embêter avec sed, pourquoi ne pas utiliser un logiciel fait pour ça ?
sudo apt-get install tidy
===>
tidy -xml -i -m nom-de-fichier.xml
Sébastien Maccagnoni - https://www.maccagnoni.eu - https://www.domotego.com
Hors ligne
#5 Le 31/01/2015, à 14:39
- Zococo
Re : [Résolu]sed - insérer une tabulation en début de ligne
Re()
Merci pour les réponses.
@pingouinux
Merci pour la commande, c'est ce qu'il me faut. J'ai fait fait un test rapide, ça a l'air de fonctionner. C'est un peu plus évolué que ce que j'ai fait tout seul. Ma version du shell est celle installée par défaut lors de l'installation d'Ubuntu 14.04 64.
@tiramiseb
Je ne connais pas tidy, je ne suis pas certain qu'il corresponde exactement à mon usage puisque je travaille sur du xml (traces gps) et pas sur du html. Je pensais que sed savait faire, et cela semble le cas, je ne suis pas allé cherché plus loin. Un truc de plus à explorer .
Je teste en "vrai" et je passe en Résolu.
Bon week end.
Dernière modification par Zococo (Le 31/01/2015, à 14:43)
Ubuntu 23.04 (64 bits) - Gigabyte B250M-DS3H / Core i5-7600K (Kaby lake) - Microsoft surface Go 3
Hors ligne
#6 Le 02/02/2015, à 22:59
- Zococo
Re : [Résolu]sed - insérer une tabulation en début de ligne
Bonsoir,
Je ne sais pas trop ce que j'ai fait ce week-end, à un moment ça fonctionnait, ensuite ne marchait plus, maintenant c'est bon.
Bref la formule de pingouinux fonctionne très bien pour traiter un nombre limité de balises. S'il y en a trop, cela devient fastidieux. Tidy est parfait pour mettre en forme un fichier xml sans en connaître la structure auparavant, mais il est beaucoup plus lent que quelques commandes sed si on sait où on va.
Bonne semaine à tous.
Ubuntu 23.04 (64 bits) - Gigabyte B250M-DS3H / Core i5-7600K (Kaby lake) - Microsoft surface Go 3
Hors ligne