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 13/06/2013, à 11:07

clark17

[Script Bash] Problème avec l'utilisation de sed

Bonjour à tous,

J'essaye d'adapter un script bash pour l'utiliser sur mon NAS Synology. Il s'agit d'un script qui télécharge un fichier xmltv sur Kazer.org, puis je lui applique quelques traitements avec sed pour remplacer les catégories fr en catégorie eng.
Voila ce que ça donne:

# Script Bash récupérateur XMLTV pour http://www.kazer.org/
# Script original par Stéphane DUBOIS, modifié par inrepublica (admin@inrepublica.fr<script type="text/javascript">
 
#!/bin/sh
 
# Définition des variables
TMPFILE=""
 
# Commande stop
_stop()
{
   if [ -n $TMPFILE ]
   then
      rm "$TMPFILE"
      rm /tmp/tvguide.xml
   fi
   exit 1
}
  
usage()
{
   echo "usage : $0 [--version|--description]"
   exit 1;
}
  
if [ $# -gt 1 ]
then
   usage
fi
  
if [ $# -eq 1 ]
then
   OPTION=$1
    
   if [ "--version" = "$OPTION" ] ; then
      echo "XMLTV module version 0.2"
      echo "Voici tv_grab_kazer version 0.2, 2013/06/12 20:00:00"
      exit
   fi
  
   if [ "--description" = "$OPTION" ] ; then
        echo "France Kazer"
        exit
   fi
  
   usage
fi
  
KAZERURL="http://www.kazer.org/tvguide.zip?u=VOTRE_USER_HASH"
     
if [ -z "$KAZERURL" ]
then
   echo "No valid KAZERURL="<url>" set" >&2
   exit 1
fi
  
TMPFILE="/tmp/$$.xmltv.zip"
  
trap "_stop" 1 2 3 15
  
wget -q "$KAZERURL" -O "$TMPFILE"
unzip "$TMPFILE" -d /tmp/
 
# Effectue la correspondance entre les catégories de Kazer et celles de TVHeadEnd
sed -ri 's/<category lang="fr">Clips/<category lang="fr">Music\/Ballet\/Dance/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Concert/<category lang="fr">Music\/Ballet\/Dance/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Débat/<category lang="fr">Social\/Political issues\/Economics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Dessin animé/<category lang="fr">Children's\/Youth programmes/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Divertissement/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Documentaire/<category lang="fr">Education\/Science\/Factual topics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Émission/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Feuilleton/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Film/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Interview/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Jeu/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Jeunesse/<category lang="fr">Children's\/Youth programmes/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Journal/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Loterie/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Magazine/<category lang="fr">Education\/Science\/Factual topics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Loterie/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Météo/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Politique/<category lang="fr">Social\/Political issues\/Economics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Série/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Spectacle/<category lang="fr">Arts\/Culture (without music)/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Sport/<category lang="fr">Sports/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Talk show/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Téléfilm/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Téléréalité/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Théâtre/<category lang="fr">Arts\/Culture (without music)/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Variétés/<category lang="fr">Arts\/Culture (without music)/g' /tmp/tvguide.xml
 
# Affichage du contenu de tvguide.xml
cat /tmp/tvguide.xml
 
rm "$TMPFILE"
rm /tmp/tvguide.xml

Le problème c'est que j'ai une erreur non bloquante quand je lance ce script:

/usr/bin/tv_grab_kazer2: line 76: can't open category: no such file

A la ligne 76 pourtant je ne vois rien de choquant!

Merci de votre aide.

Hors ligne

#2 Le 13/06/2013, à 11:13

pingouinux

Re : [Script Bash] Problème avec l'utilisation de sed

Bonjour,
C'est le ' de Children's qui pose problème : à remplacer par Children\'s

sed -ri 's/<category lang="fr">Jeunesse/<category lang="fr">Children\'s\/Youth programmes/g' /tmp/tvguide.xml

Dernière modification par pingouinux (Le 13/06/2013, à 11:15)

Hors ligne

#3 Le 13/06/2013, à 11:20

clark17

Re : [Script Bash] Problème avec l'utilisation de sed

Effectivement j'étais passé à coté! Par contre pourquoi il m'indique la ligne 76 alors qu'a la ligne 68 j'ai la même erreur de syntaxe roll

Hors ligne

#4 Le 13/06/2013, à 11:37

clark17

Re : [Script Bash] Problème avec l'utilisation de sed

Bon maintenant voici le script:

# Script Bash récupérateur XMLTV pour http://www.kazer.org/
# Script original par Stéphane DUBOIS, modifié par inrepublica (admin@inrepublica.fr)

#!/bin/sh

# Définition des variables
TMPFILE=""

# Commande stop
_stop()
{
   if [ -n $TMPFILE ]
   then
      rm "$TMPFILE"
      rm /tmp/tvguide.xml
   fi
   exit 1
}
 
usage()
{
   echo "usage : $0 [--version|--description]"
   exit 1;
}
 
if [ $# -gt 1 ]
then
   usage
fi
 
if [ $# -eq 1 ]
then
   OPTION=$1
   
   if [ "--version" = "$OPTION" ] ; then
      echo "XMLTV module version 0.2"
      echo "Voici tv_grab_kazer version 0.2, 2013/06/12 20:00:00"
      exit
   fi
 
   if [ "--description" = "$OPTION" ] ; then
        echo "France Kazer"
        exit
   fi
 
   usage
fi
 
KAZERURL="http://www.kazer.org/tvguide.zip?u=VOTRE_CLEF"
	
if [ -z "$KAZERURL" ]
then
   echo "No valid KAZERURL="<url>" set" >&2
   exit 1
fi
 
TMPFILE="/tmp/$$.xmltv.zip"
 
trap "_stop" 1 2 3 15
 
wget -q "$KAZERURL" -O "$TMPFILE"
unzip "$TMPFILE" -d /tmp/

# Effectue la correspondance entre les catégories de Kazer et celles de TVHeadEnd
sed -ri 's/<category lang="fr">Clips/<category lang="fr">Music\/Ballet\/Dance/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Concert/<category lang="fr">Music\/Ballet\/Dance/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Débat/<category lang="fr">Social\/Political issues\/Economics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Dessin animé/<category lang="fr">Children\'s\/Youth programmes/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Divertissement/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Documentaire/<category lang="fr">Education\/Science\/Factual topics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Émission/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Feuilleton/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Film/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Interview/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Jeu/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Jeunesse/<category lang="fr">Children\'s\/Youth programmes/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Journal/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Loterie/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Magazine/<category lang="fr">Education\/Science\/Factual topics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Loterie/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Météo/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Politique/<category lang="fr">Social\/Political issues\/Economics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Série/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Spectacle/<category lang="fr">Arts\/Culture \(without music\)/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Sport/<category lang="fr">Sports/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Talk show/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Téléfilm/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Téléréalité/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Théâtre/<category lang="fr">Arts\/Culture \(without music\)/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Variétés/<category lang="fr">Arts\/Culture \(without music\)/g' /tmp/tvguide.xml

# Affichage du contenu de tvguide.xml
cat /tmp/tvguide.xml

rm "$TMPFILE"
rm /tmp/tvguide.xml

Et cette fois j'ai cette erreur:

/usr/bin/tv_grab_kazer2: line 90: syntax error: unterminated quoted string

la ligne 90 c'est mon dernier sed, unterminated quoted???

Dernière modification par clark17 (Le 13/06/2013, à 16:11)

Hors ligne

#5 Le 13/06/2013, à 12:47

tiramiseb

Re : [Script Bash] Problème avec l'utilisation de sed

Salut,

Par contre pourquoi il m'indique la ligne 76 alors qu'a la ligne 68 j'ai la même erreur de syntaxe roll

Il a probablement pris les lignes 68 à 76 comme des arguments de la commande en ligne 68, ou un truc dans le genre...

unterminated quoted???

Il semble qu'on ne peut pas échapper une apostrophe dans une chaîne protégée par des apostrophes :

sebastien@cao:~$ echo '\''
> ^C
sebastien@cao:~$ echo 'a\''b'
a\b
sebastien@cao:~$ echo "\""
"

La solution serait :

- soit de ne pas utiliser les apostrophes pour encadrer la chaîne :

sed -ri "s/<category lang=\"fr\">Jeunesse/<category lang=\"fr\">Children's\/Youth programmes/g' /tmp/tvguide.xml

- soit de diviser ta chaîne en plusieurs parties pour pouvoir mettre un apostrophe :

sed -ri 's/<category lang="fr">Jeunesse/<category lang="fr">Children'"'"'s\/Youth programmes/g' /tmp/tvguide.xml

Par ailleurs, une double remarque pour ton script :

1/ tu parles de script bash alors que dans le shebang de ton script ça appellerait "sh". Attention, bash et sh ce n'est pas la même chose et bash a des instructions supplémentaires, pas nécessairement connues par les shell "compatibles sh", ni (forcément) par sh lui-même.

2/ tu n'as pas mis le shebang en toute première ligne du script, du coup il ne sert à rien.

Dernière modification par tiramiseb (Le 13/06/2013, à 12:49)

Hors ligne

#6 Le 13/06/2013, à 15:05

pingouinux

Re : [Script Bash] Problème avec l'utilisation de sed

Je suis allé effectivement un peu vite, et qui plus est sans tester. tiramiseb indique 2 bonnes solutions en #5. On peut reproduire le cas avec 2 lignes

$ cat z
#!/bin/bash
set -x
sed -ri 's/<categori lang="fr">Dessin animé/<categorj lang="fr">Children's\/Youth programmes/g' /tmp/tvguide.xml
sed -ri 's/<categork lang="fr">Jeunesse/<categorl lang="fr">Children's\/Youth programmes/g' /tmp/tvguide.xml
$ ./z
+ sed -ri 's/<categori lang="fr">Dessin animé/<categorj lang="fr">Childrens/Youth' 'programmes/g /tmp/tvguide.xml
sed -ri s/' lang=fr lang=fr /tmp/tvguide.xml
./z: line 4: categork: No such file or directory

Il considère <categork comme une redirection de stdin.

Hors ligne

#7 Le 13/06/2013, à 15:33

clark17

Re : [Script Bash] Problème avec l'utilisation de sed

tiramiseb a écrit :

- soit de ne pas utiliser les apostrophes pour encadrer la chaîne :

sed -ri "s/<category lang=\"fr\">Jeunesse/<category lang=\"fr\">Children's\/Youth programmes/g' /tmp/tvguide.xml

A la fin tu mets un simple quote, ne serait-ce pas un double quote plutôt?

tiramiseb a écrit :

- soit de diviser ta chaîne en plusieurs parties pour pouvoir mettre un apostrophe :

sed -ri 's/<category lang="fr">Jeunesse/<category lang="fr">Children'"'"'s\/Youth programmes/g' /tmp/tvguide.xml

Ca marche nickel comme ça. Je vais plutôt utiliser cette méthode "plus simple" pour gérer un seul échappement.

tiramiseb a écrit :

1/ tu parles de script bash alors que dans le shebang de ton script ça appellerait "sh". Attention, bash et sh ce n'est pas la même chose et bash a des instructions supplémentaires, pas nécessairement connues par les shell "compatibles sh", ni (forcément) par sh lui-même.

La je suis complètement largué (gros débutant inside)... Si je comprend bien un shell est un interpréteur de commande? On écrit un script qui est interprété par l’interpréteur? Un peu comme du php non? <- (Désolé si c'est une grosse connerie).
Il existe plusieurs interpréteur alors comme sh ou bash?
Dans mon cas j'utilise ce script sur un nas synology, quand par ssh je lance mon fichier en tapant juste son nom (tv_grab_kazer2) quel interpréteur se lance? Quand je tape sh c'est busybox qui se lance, j'imagine donc que c'est lui l'interpréteur?

tiramiseb a écrit :

2/ tu n'as pas mis le shebang en toute première ligne du script, du coup il ne sert à rien.

Erreur corrigée.


Avec beaucoup d'aide voici donc le script qui fonctionne sans erreurs:

#!/bin/sh

# Script sh récupérateur XMLTV pour http://www.kazer.org/
# Script original par Stéphane DUBOIS, modifié par inrepublica (admin@inrepublica.fr)

# Définition des variables
TMPFILE=""

# Commande stop
_stop()
{
   if [ -n $TMPFILE ]
   then
      rm "$TMPFILE"
      rm /tmp/tvguide.xml
   fi
   exit 1
}
 
usage()
{
   echo "usage : $0 [--version|--description]"
   exit 1;
}
 
if [ $# -gt 1 ]
then
   usage
fi
 
if [ $# -eq 1 ]
then
   OPTION=$1
   
   if [ "--version" = "$OPTION" ] ; then
      echo "XMLTV module version 0.2"
      echo "Voici tv_grab_kazer version 0.2, 2013/06/12 20:00:00"
      exit
   fi
 
   if [ "--description" = "$OPTION" ] ; then
        echo "France Kazer"
        exit
   fi
 
   usage
fi
 
KAZERURL="http://www.kazer.org/tvguide.zip?u=VOTRE_CLEF"
	
if [ -z "$KAZERURL" ]
then
   echo "No valid KAZERURL="<url>" set" >&2
   exit 1
fi
 
TMPFILE="/tmp/$$.xmltv.zip"
 
trap "_stop" 1 2 3 15
 
wget -q "$KAZERURL" -O "$TMPFILE"
unzip "$TMPFILE" -d /tmp/

# Effectue la correspondance entre les catégories de Kazer et celles de TVHeadEnd
sed -ri 's/<category lang="fr">Clips/<category lang="fr">Music\/Ballet\/Dance/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Concert/<category lang="fr">Music\/Ballet\/Dance/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Débat/<category lang="fr">Social\/Political issues\/Economics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Dessin animé/<category lang="fr">Children'"'"'s\/Youth programmes/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Divertissement/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Documentaire/<category lang="fr">Education\/Science\/Factual topics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Émission/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Feuilleton/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Film/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Interview/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Jeu/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Jeunesse/<category lang="fr">Children'"'"'s\/Youth programmes/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Journal/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Loterie/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Magazine/<category lang="fr">Education\/Science\/Factual topics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Loterie/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Météo/<category lang="fr">News\/Current affairs/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Politique/<category lang="fr">Social\/Political issues\/Economics/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Série/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Spectacle/<category lang="fr">Arts\/Culture \(without music\)/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Sport/<category lang="fr">Sports/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Talk show/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Téléfilm/<category lang="fr">Movie\/Drama/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Téléréalité/<category lang="fr">Show\/Game show/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Théâtre/<category lang="fr">Arts\/Culture \(without music\)/g' /tmp/tvguide.xml
sed -ri 's/<category lang="fr">Variétés/<category lang="fr">Arts\/Culture \(without music\)/g' /tmp/tvguide.xml

# Affichage du contenu de tvguide.xml
cat /tmp/tvguide.xml

rm "$TMPFILE"
rm /tmp/tvguide.xml

En regardant à nouveau ma commande sed, je me demande si je n'aurais pas plus simple quand même. C'est la répétition de "<category lang="fr">" qui me dérange.

Mais merci beaucoup pour le coup de main.

Dernière modification par clark17 (Le 13/06/2013, à 16:11)

Hors ligne

#8 Le 13/06/2013, à 15:57

tiramiseb

Re : [Script Bash] Problème avec l'utilisation de sed

A la fin tu mets un simple quote, ne serait-ce pas un double quote plutôt?

Oups si désolé. Donc ce serait :

sed -ri "s/<category lang=\"fr\">Jeunesse/<category lang=\"fr\">Children's\/Youth programmes/g" /tmp/tvguide.xml

Si je comprend bien un shell est un interpréteur de commande? On écrit un script qui est interprété par l’interpréteur? Un peu comme du php non?

C'est cela, oui.

Il existe plusieurs interpréteur alors comme sh ou bash?

Il en existe des dizaines, les plus connus étant : sh, csh, tcsh, ksh, bash, dash, zsh...


Dans mon cas j'utilise ce script sur un nas synology, quand par ssh je lance mon fichier en tapant juste son nom (tv_grab_kazer2) quel interpréteur se lance? Quand je tape sh c'est busybox qui se lance, j'imagine donc que c'est lui l'interpréteur?

C'est probablement busybox oui. Donc support très limité du strict minimum des fonctions.

Mais bon si ça marche c'est que tu utilises bien un sous-ensemble de ce strict minimum wink

Hors ligne

#9 Le 13/06/2013, à 17:25

clark17

Re : [Script Bash] Problème avec l'utilisation de sed

Ok super, merci pour les explications.

Pour ceux que ça intéresse j'ai mis en place un github pour héberger le script: https://github.com/clark17/tv_grab_FR_Kazer

Hors ligne

#10 Le 13/06/2013, à 17:27

pingouinux

Re : [Script Bash] Problème avec l'utilisation de sed

@clark17 :
Tu peux effectivement simplifier la série de sed. Pour ne pas s'embêter avec les \ /, il faut un caractère qui n'apparaît pas dans la chaîne d'origine, ni dans celle de remplacement. J'ai pris ici @. Toute la séquence de sed peut être remplacée par :

cat <<"EOF" >/tmp/in$$
Clips@Music/Ballet/Dance/
Concert@Music/Ballet/Dance/
Débat@Social/Political issues/Economics/
Dessin animé@Children's/Youth programmes/
Divertissement@Show/Game show/
Documentaire@Education/Science/Factual topics/
Émission@Show/Game show/
Feuilleton@Movie/Drama/
Film@Movie/Drama/
Interview@News/Current affairs/
Jeu@Show/Game show/
Jeunesse@Children's/Youth programmes/
Journal@News/Current affairs/
Loterie@Show/Game show/
Magazine@Education/Science/Factual topics/
Loterie@Show/Game show/
Météo@News/Current affairs/
Politique@Social/Political issues/Economics/
Série@Movie/Drama/
Spectacle@Arts/Culture /without music//
Sport@Sports/
Talk show@Show/Game show/
Téléfilm@Movie/Drama/
Téléréalité@Show/Game show/
Théâtre@Arts/Culture /without music//
Variétés@Arts/Culture /without music//
EOF

while IFS=@ read C1 C2
do
   sed -i "s@\(<category lang=\"fr\">\)$C1@\1$C2@g" /tmp/tvguide.xml
done </tmp/in$$

rm /tmp/in$$

Dernière modification par pingouinux (Le 13/06/2013, à 17:28)

Hors ligne

#11 Le 13/06/2013, à 19:19

clark17

Re : [Script Bash] Problème avec l'utilisation de sed

Je comprend pas trop le code, je suis ultra débutant.
Les $$ c'est une valeur hérité du script?
D'après ce que je comprend tu crées une sorte de csv avec comme séparateur @?
Au niveau de la boucle je suis largué c'est quoi IFS=@?

Hors ligne

#12 Le 13/06/2013, à 19:42

tiramiseb

Re : [Script Bash] Problème avec l'utilisation de sed

Dis donc pingouinux, tu es sûr que la syntaxe de ton exemple est entièrement en sh POSIX ?

Hors ligne

#13 Le 13/06/2013, à 20:06

pingouinux

Re : [Script Bash] Problème avec l'utilisation de sed

clark17   #11 a écrit :

Les $$ c'est une valeur hérité du script?

Oui, différente à chaque exécution. /tmp/in$$ est un fichier temporaire.

D'après ce que je comprend tu crées une sorte de csv avec comme séparateur @?

On peut le dire comme ça. Le champ à remplacer et celui qui le remplace sont séparés par le caractère @

Au niveau de la boucle je suis largué c'est quoi IFS=@?

IFS : Internal Field Separator

IFS=@ read C1 C2

C1 va contenir tout ce qui se trouve avant le premier @ sur la ligne (en fait, il n'y a qu'un seul @), et C2 tout ce qui suit

tiramiseb   #12 a écrit :

Dis donc pingouinux, tu es sûr que la syntaxe de ton exemple est entièrement en sh POSIX ?

A priori, oui. J'ai testé avec #!/bin/sh (qui pointe sur #!/bin/dash)

Hors ligne

#14 Le 13/06/2013, à 23:30

clark17

Re : [Script Bash] Problème avec l'utilisation de sed

En fouillant sur mon synology dans bin j'ai deux shell: sh et ash.

J'essaye de comprendre ta boucle mais je sèche un peu quand même.
while IFS=@ read C1 C2 veux dire tant que je peux lire C1 et C2. Mais comment il sait qu'il faut aller le chercher dans in$$?

Sur la commande sed je pige pas non plus, pour moi une substitution avec plusieurs occurences c'est comme ça: s/motif/substitut/g
Alors que toi ta syntaxe est complétement différente! \ à la place de / mad

Elle va me rendre fou cette commande ;-)

Hors ligne

#15 Le 13/06/2013, à 23:42

clark17

Re : [Script Bash] Problème avec l'utilisation de sed

Je continue mes investigations, le @ devient le délimiteur pour ne pas rentrer en conflit avec / stocké dans les variable c'est ça?
Et ensuite les parenthèses capture puis tu fais une référence arrière avec \1?

Hors ligne

#16 Le 14/06/2013, à 06:15

pingouinux

Re : [Script Bash] Problème avec l'utilisation de sed

clark17   #14 a écrit :

Mais comment il sait qu'il faut aller le chercher dans in$$?

while ............
do
   .............
done </tmp/in$$

Ceci est une seule commande, qui prend comme entrée standard /tmp/in$$

On peut d'ailleurs se passer de ce fichier temporaire :

{ cat <<"EOF"
Clips@Music/Ballet/Dance/
................
EOF
} | while IFS=@ read C1 C2
do
   sed -i "s@\(<category lang=\"fr\">\)$C1@\1$C2@g" /tmp/tvguide.xml
done

Sur la commande sed je pige pas non plus, pour moi une substitution avec plusieurs occurences c'est comme ça: s/motif/substitut/g

Ce que tu dis en #15 est juste. On peut remplacer / par n'importe quel autre caractère, pour éviter les conflits

s@motif@substitut@g

ou

s=motif=substitut=g

Le g est d'ailleurs inutile ici, car il n'y a pas plus d'une occurrence du motif sur la ligne.

Hors ligne