[shell] respecter la casse d'une commande sed

Résolu/Fermé
sdrogba Messages postés 67 Date d'inscription mercredi 18 août 2010 Statut Membre Dernière intervention 3 novembre 2016 - 4 juil. 2012 à 15:04
sdrogba Messages postés 67 Date d'inscription mercredi 18 août 2010 Statut Membre Dernière intervention 3 novembre 2016 - 4 juil. 2012 à 16:17
Bonjour,

Je suis débutant dans la programmation de shell (j'ai commencé ce matin) ^^

Bref je galère un peu j'aurais voulu savoir si vous auriez une solution à mon problème svp
voici tout d'abbord mon script actuel :

#!/bin/bash

for file in *.txt
do
   echo "Traitement de $file ..."
   sed -i -e "s/WHENEVER ERROR CALL sortie/WHENEVER ERROR CALL prog_sortie/g" "$file"
   sed -i -e "s/WHENEVER ERROR CALL SORTIE/WHENEVER ERROR CALL prog_sortie/g" "$file"
   sed -i -e "s/WHENEVER ERROR CALL Sortie/WHENEVER ERROR CALL prog_sortie/g" "$file"
done


Vous serez d'accord avec moi ça marche mais ce n'est vraiment pas joli!!!
Comme vous l'aurez remarqué j'ai plusieurs façon possible de trouver "sortie" du coup je cherche comment faire pour que le script le trouve tout le temps.
De plus entre chaque logiquement il n'y a qu'un seul espace mais ce n'est pas forcément le cas.

Voilà j'ai beau regarder du coté des expressions régulières je ne trouve pas, si vous avez une idée je suis preneur.

Merci d'avance.

3 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
4 juil. 2012 à 15:18
Salut,

Essaye ça :

sed 's/\(WHENEVER ERROR CALL \)\(sortie\)/\1prog_\L\2/Ig'
0
sdrogba Messages postés 67 Date d'inscription mercredi 18 août 2010 Statut Membre Dernière intervention 3 novembre 2016
4 juil. 2012 à 15:26
tout d'abord merci pour ta réponse.

Elle fonctionne à merveille au niveau de la casse, c'est magique par contre pour les espaces entre chaque mots cela ne fonctionne pas...

Enfin pourrait tu m'expliquer ce que

sed 's/\(WHENEVER ERROR CALL \)\(sortie\)/\1prog_\L\2/Ig'

veut dire exactement, enfin découpé pour que je comprenne stp
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
4 juil. 2012 à 15:36
par contre pour les espaces entre chaque mots cela ne fonctionne pas...
Euh... c'est à dire ? Dans ton exemple il n'y a rien concernant les espaces ;-\

Pour la syntaxe :

\(...\)
Permet de définir des sous-expressions. Chaque sous-expression étant référencée par la suite par son ordre d'apparition sur le ligne (9 au maximum).
Donc le "\1" correspond à /\(WHENEVER ERROR CALL \)
Et le \2 à \(sortie\)

I
En fin d'expression (juste avant le "g"), permet de traiter les motifs sans tenir compte de la casse.

\L
Permet de passer en minuscule tout ce qui se trouve après lui dans la partie droite de la substitution.
Donc comme c'est le "\2" (qui correspond à sortie) qui est derrière, sera passé en minuscule.

Voir la FAQ sur SED pour plus d'explications.
0
sdrogba Messages postés 67 Date d'inscription mercredi 18 août 2010 Statut Membre Dernière intervention 3 novembre 2016
4 juil. 2012 à 15:45
Ok merci pour ses explications.

Pour les espaces :

Normalement il n'y a qu'un espace entre chaque mot hélas il se peut qu'il y en ai plusieurs de temps en temps dans mes fichiers donc je voudrais faire en sorte que si il y a un espace entre chaque mot c'est cool mais si il y a deux espaces (voir plus) entre chaque mot qu'il remplace quand meme par un seul espace.

Pas facile a expliqué donc exemple

WHENEVER ERROR CALL SORTIE doit donné
WHENEVER ERROR CALL prog_sortie
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 407
4 juil. 2012 à 15:55
$ cat plop 
WHENEVER  ERROR CALL sortie
WHENEVER ERROR   CALL SORTIE
WHENEVER ERROR CALL   Sortie

$ sed 's/\(WHENEVER \+ERROR \+CALL\) \+\(sortie\)/\1 prog_\L\2/I;s/ \+/ /g' plop 
WHENEVER ERROR CALL prog_sortie
WHENEVER ERROR CALL prog_sortie
WHENEVER ERROR CALL prog_sortie

$
0
sdrogba Messages postés 67 Date d'inscription mercredi 18 août 2010 Statut Membre Dernière intervention 3 novembre 2016
4 juil. 2012 à 16:17
merci
0