Suppression des espaces dans une variable
Résolu
                                    
                        tbeghain                    
                                    -
                                     
tbeghain -
        tbeghain -
        Bonjour,  
En shell, je voudrais supprimer les espaces devant et derriere une variable.
J'ai un fichier texte préformaté contenant des ":" qui servent de séparateur de champ.
(NB : j'ai remplacé les blancs par & car ça ne passe pas en visualisation sur ce site)
Par exemple, j'ai une ligne ': Libelle du message&&&&&&&:&&&&&&&bonjour& Monsieur&&&&&&&:'
Toutes les lignes sont formatées de la même façon
Je veux récupérer le contenu de chaque ligne dans une variable.
Pour faire cela, je lis le fichier par une boucle while
IFS=":"
while read zon1 zon2 zon3 zon4 zon5
do
zone2='echo $zon2'
done < /tmp/browse_req.tmp
D'habitude, pour supprimer les espaces, j'utilise une commande toute simple et efficace jusqu'à présent :
zone2='echo $zon2'
ce qui donnait bien 'bonjour Monsieur' dans ma variable $zone2
Mais là, je suis dans le contexte d'un while avec séparateur (:) et là, la commande miracle ci-dessus ne fonctionne plus du tout. En fait, ma variable a gardé la valeur '&&&&&&&bonjour&Monsieur&&&&&&&&'
Quelqu'un aurait-il une astuce s'il vous plait ? Merci
                
            
                
    
    
    
        En shell, je voudrais supprimer les espaces devant et derriere une variable.
J'ai un fichier texte préformaté contenant des ":" qui servent de séparateur de champ.
(NB : j'ai remplacé les blancs par & car ça ne passe pas en visualisation sur ce site)
Par exemple, j'ai une ligne ': Libelle du message&&&&&&&:&&&&&&&bonjour& Monsieur&&&&&&&:'
Toutes les lignes sont formatées de la même façon
Je veux récupérer le contenu de chaque ligne dans une variable.
Pour faire cela, je lis le fichier par une boucle while
IFS=":"
while read zon1 zon2 zon3 zon4 zon5
do
zone2='echo $zon2'
done < /tmp/browse_req.tmp
D'habitude, pour supprimer les espaces, j'utilise une commande toute simple et efficace jusqu'à présent :
zone2='echo $zon2'
ce qui donnait bien 'bonjour Monsieur' dans ma variable $zone2
Mais là, je suis dans le contexte d'un while avec séparateur (:) et là, la commande miracle ci-dessus ne fonctionne plus du tout. En fait, ma variable a gardé la valeur '&&&&&&&bonjour&Monsieur&&&&&&&&'
Quelqu'un aurait-il une astuce s'il vous plait ? Merci
        A voir également:         
- Suppression des espaces dans une variable
- Forcer suppression fichier - Guide
- Espaces insécables - Guide
- Suppression compte gmail - Guide
- Suppression page word - Guide
- Suppression des cookies - Guide
11 réponses
                        
                    Salut,
                
                
    
                lami20j@debian-acer:~$ var="   aaa   "
lami20j@debian-acer:~$ echo "|$var|"
|   aaa   |
lami20j@debian-acer:~$ echo "|${var// /}|"
|aaa|
                        
                    salut,
si tu utilises bash vérifie que shopt extglob est sur on (sinon active-le), et utilise la correspondance de motif étendue
sinon utilise sed.
    
                si tu utilises bash vérifie que shopt extglob est sur on (sinon active-le), et utilise la correspondance de motif étendue
zone2="${zone2//+( )/ }"
sinon utilise sed.
                        
                    hello
    
                $ shopt -s extglob
$ z="    aaa bbb    "
$ echo "-${z}-"
-    aaa bbb    -
$ 
$ z=${z##*( )}
$ z=${z%%*( )}
$ echo "-${z}-"
-aaa bbb-
$
                
                
                        
                    Bonjour,
Ca ne fonctionne pas. Je suis en AIX 6.1. Il n'y a pas shopt sur le système. Je veux bien essayer avec sed ou awk, mais je ne connais pas assez bien ces commandes.
Une autre idée ?
Merci
    
                Ca ne fonctionne pas. Je suis en AIX 6.1. Il n'y a pas shopt sur le système. Je veux bien essayer avec sed ou awk, mais je ne connais pas assez bien ces commandes.
Une autre idée ?
Merci
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
                        
                    Bonjour,
Oui, les trois propositions. Même la première ne fonctionne pas,
test2.sh[3]: "|${var// /}|": bad substitution
Cordialement,
    
                Oui, les trois propositions. Même la première ne fonctionne pas,
test2.sh[3]: "|${var// /}|": bad substitution
Cordialement,
                        
                    ton shell est ksh ?
    
                $ z="    aaa bbb    "   
$ echo "-${z}-"
-    aaa bbb    -
$ 
$ z=$(echo "$z" | sed 's/^ *//;s/ *$//')
$ echo "-${z}-"
-aaa bbb-
$ 
                
                lami20j@debian-acer:~$ var=" Bonjour Monsieur " lami20j@debian-acer:~$ echo "|$var|" | Bonjour Monsieur | lami20j@debian-acer:~$ var2=$(echo "$var" | perl -pe 's/^ *| *$//g') lami20j@debian-acer:~$ echo "|$var2|" |Bonjour Monsieur|
                        
                    j'avais mal lu
    
                while IFS=":" read zone1 zone2 zone3; do zone2=$(echo $zone2); echo "-${zone2}-"; done <<<""Libelle du message      :       bonjour  Monsieur     :" 
-Bonjour monsieur-derait résoudre ton "problème". l'emplacement de l'IFS est important ici il n'est modifié que pour read.
                
                
                        
                    merci pour toutes vos réponses, mais ça ne fonctionne toujours pas. En fait vos exemples fonctionnent lorsqu'on les prend tels quels. Mais lorsqu'on les place dans une boucle while avec IFS=:, alors là, ça ne fonctionne plus ....
voici le fichier en entrée (du moins un extrait):
(Toujours pareil , & remplace un espace)
upgl1-dmsys:/tmp-> cat browse_req.tmp
:Createur&&&&&&&&:&GL11401&&&&&&&&:
:Date&de&creation&&&&&&&&:&14-APR-2011&&&&&&&&:
:Serveur&de&distribution&&&&&&&&:&OUI&&&&&&&&
:Breve&description&&&&&&&&:&Elisabeth&&&&&&&&
et voilà le programme
IFS=":"
# lecture du fichier resultat pour extraction des attributs
while read zon1 zon2 zon3 zon4 zon5
do
zon2=$(echo "$zon2" | sed 's/ \{1,\}/ /g')
echo "|$zon2|"
done < /tmp/browse_req.tmp
et voilà ce que ça donne
|Createur&&&&&&&&|
|Date&de&creation&&&&&&&&|
|Serveur&de&distribution&&&&&&&&|
|Breve&description&&&&&&&&|
    
                voici le fichier en entrée (du moins un extrait):
(Toujours pareil , & remplace un espace)
upgl1-dmsys:/tmp-> cat browse_req.tmp
:Createur&&&&&&&&:&GL11401&&&&&&&&:
:Date&de&creation&&&&&&&&:&14-APR-2011&&&&&&&&:
:Serveur&de&distribution&&&&&&&&:&OUI&&&&&&&&
:Breve&description&&&&&&&&:&Elisabeth&&&&&&&&
et voilà le programme
IFS=":"
# lecture du fichier resultat pour extraction des attributs
while read zon1 zon2 zon3 zon4 zon5
do
zon2=$(echo "$zon2" | sed 's/ \{1,\}/ /g')
echo "|$zon2|"
done < /tmp/browse_req.tmp
et voilà ce que ça donne
|Createur&&&&&&&&|
|Date&de&creation&&&&&&&&|
|Serveur&de&distribution&&&&&&&&|
|Breve&description&&&&&&&&|
