#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 c'est noté pour le parcours de fichier et de tableau !
Hors ligne