[shell] respecter la casse d'une commande sed

Résolu/Fermé
Signaler
Messages postés
67
Date d'inscription
mercredi 18 août 2010
Statut
Membre
Dernière intervention
3 novembre 2016
-
Messages postés
67
Date d'inscription
mercredi 18 août 2010
Statut
Membre
Dernière intervention
3 novembre 2016
-
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

Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 586
Salut,

Essaye ça :

sed 's/\(WHENEVER ERROR CALL \)\(sortie\)/\1prog_\L\2/Ig'
0
Messages postés
67
Date d'inscription
mercredi 18 août 2010
Statut
Membre
Dernière intervention
3 novembre 2016

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
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 586
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
Messages postés
67
Date d'inscription
mercredi 18 août 2010
Statut
Membre
Dernière intervention
3 novembre 2016

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
Messages postés
36324
Date d'inscription
dimanche 7 novembre 2010
Statut
Contributeur
Dernière intervention
27 janvier 2021
6 586
$ 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
Messages postés
67
Date d'inscription
mercredi 18 août 2010
Statut
Membre
Dernière intervention
3 novembre 2016

merci
0