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 12/04/2020, à 18:48

Nihio

Ajouter une ligne après un pattern avec sed

Hello,

J'ai un petit soucis en bash avec la commande sed.

#!/bin/bash


file="$(cat gamelist.xml)"
tableau=()
i=0

for line in $file; do 
        if [[ "$line" == *"<path>./"[a-z]* ]] || [[ "$line" == *"<path>./"[0-9]* ]]
        then
            video="$(echo $line | cut -f2 -d/ | cut -f1 -d.)"
            tableau+=("$video")
            let i=i+1
        fi 
done

for i in ${tableau[*]}
do
    path="<path>./$i.zip</path>"
    pathVideo="<video>./downloaded_videos/$i.mp4</video>"
    sed -i "/$path/a $pathVideo" gamelist.xml
done

J'aimerai ajouter dans mon fichier gamelist.xml une ligne après un pattern, mais j'ai l'impression que le caractère "/" dans mes variables empêchent mon script de fonctionner, je n'arrive pas à ne pas faire interprêter "/" à sed pour qu'il puisse trouver une ligne contenant "<path>xxx.zip</path>" et qu'il ajoute à la ligne suivant "<video>./downloaded_videos/xxx.mp4</video>".

Je parcours d'abord le fichier, je prend ce qui m'intéresse et je le met dans un tableau. Je parcours ensuite le tableau et à chaque case, je fais mon sed dans gamelist.xml.

Comment je peux lui dire de ne pas interprêter les "/" ?

Merci

EDIT : Un petit aperçu de mon fichier gamelist.xml

<gameList>
<game id="37561" source="ScreenScraper">
	<path>./2020bb.zip</path>
	<name>2020 SUPER BASEBALL</name>
	<desc>DANS 2020 SUPER BASEBALL, LE BASEBALL EST REVISITÉ AVEC DES ÉLÉMENTS FUTURISTES MÊME SI LES RÈGLES SONT CONSERVÉES. PAR EXEMPLE, PENDANT LA PHASE DE DÉFENSE, LES JOUEURS PEUVENT SAUTER TRÈS HAUT À L'AIDE DE JETPACKS. LES ÉQUIPES COMPRENNENT DES JOUEURS HUMAINS ET DES ROBOTS. CERTAINES ÉQUIPES NE SONT COMPOSÉES QUE DE ROBOTS. CHAQUE ACTION EFFECTUÉE RAPPORTE DE L'ARGENT. AVANT QUE LE LANCEUR NE LANCE LA BALLE, LE JOUEUR PEUT CHANGER DE BATTEUR OU AMÉLIORER SA PUISSANCE (VITESSE, FRAPPE, RÉSISTANCE). LES AMÉLIORATIONS ONT TROIS NIVEAUX MAXIMUM. EN PHASE DE DÉFENSE, LE JOUEUR CONTRÔLE À TOUR DE RÔLE LE LANCEUR ET LES JOUEURS DE CHAMPS. EN TANT QUE LANCEUR, IL Y A PLUSIEURS CHOIX DE TIRS SELON LE LANCEUR UTILISÉ.</desc>
	<image>./downloaded_images/2020bb-image.png</image>
	<rating>0.6</rating>
	<releasedate>19910101T000000</releasedate>
	<developer>PALLAS</developer>
	<publisher>SNK</publisher>
	<genre>SPORT / BASEBALL</genre>
	<players>1-2</players>
	<region/>
</game>
<game id="13937" source="ScreenScraper">
	<path>./3countb.zip</path>
	<name>3 COUNT BOUT</name>
	<desc>UN TRÈS BON JEU DE CATCH, RESSEMBLANT ÉNORMÉMENT À MUSCLE BOMBER DE CAPCOM. SORTEZ DU RANG DES AMATEURS ET PRENEZ LES 10 MEILLEURS ESPOIR DE LUTTE POUR REMPORTER LE TITRE DE CHAMPION DU MONDE. BATTEZ VOUS AVEC CES CHAMPIONS PRÊTS À TOUT ! </desc>
	<image>./downloaded_images/3countb-image.png</image>
	<rating>0.6</rating>
	<releasedate>19930101T000000</releasedate>
	<developer>SNK</developer>
	<publisher>SNK</publisher>
	<genre>COMBAT</genre>
	<players>1-2</players>
	<region/>
</game>
...
...

Dernière modification par Nihio (Le 12/04/2020, à 18:49)

Hors ligne

#2 Le 12/04/2020, à 19:19

pingouinux

Re : Ajouter une ligne après un pattern avec sed

Bonjour,
Tu peux remplacer / par n'importe quel caractère absent de la chaîne recherchée.
Par exemple, avec # (le premier doit être précédé de \) :

    sed -i "\#$path#a $pathVideo" gamelist.xml

Hors ligne

#3 Le 12/04/2020, à 19:20

kamaris

Re : Ajouter une ligne après un pattern avec sed

Bon, je pense que ce que tu veux faire, c'est ça :

sed -E 's%(.*)<path>./(.*)\..*%&\n\1<video>./downloaded_videos/\2.mp4</video>%' gamelist.xml

Si ça convient, tu pourras rajouter le -i pour modifier le fichier d'entrée.

Pour répondre à ta question sur les slashs, il fallait les protéger par un antislash :

path="<path>.\/$i.zip<\/path>"

Sinon, ton code bash était vraiment à revoir : en particulier, pour lire un fichier, on fait

while IFS='' read -r line; do
  …
done <fichier

Une boucle for ne lit pas des lignes mais des mots.
Et pour boucler proprement sur les éléments d'un tableau, on fait

for i in "${tableau[@]}"; do
  …
done

Dernière modification par kamaris (Le 12/04/2020, à 19:21)

Hors ligne

#4 Le 12/04/2020, à 19:54

Nihio

Re : Ajouter une ligne après un pattern avec sed

Merci beaucoup pour votre aide ! Je devrai m'en sortir maintenant smile c'est noté pour le parcours de fichier et de tableau !

Hors ligne