#1 Le 22/01/2023, à 15:24
- Tawal
[Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Hello,
Je cherchais, par le biais de substitutions, à enlever les espaces en début et fin d'un contenu de variable.
Et je n'y suis pas arrivé
Mon cas précis est de récupérer le 1er mot sans passer par un tableau.
Car le contenu de la variable venant d'un retour de commande, je veux éviter un readarray.
Puis, je me suis souvenu que bash crée des tableaux par fonctionnement, notamment le tableau BASH_REMATCH (cf. man bash).
Je me suis servis de cette particularité pour résoudre mon problème.
On part avec cette variable :
$ var=$(echo -e " \t des espaces au début et des espaces à la fin. \t ")
$ echo "${var}X"
des espaces au début et des espaces à la fin. X
$
La solution à mon cas (extraire le 1er mot) :
$ [[ $var =~ ^[[:space:]]*([^[:space:]]*) ]] && echo "${BASH_REMATCH[1]}X"
desX
$
Enlever les espaces de début et fin :
$ [[ $var =~ ^[[:space:]]*([^[:space:]].*[^[:space:]]) ]] && echo "${BASH_REMATCH[1]}X"
des espaces au début et des espaces à la fin.X
$
Mes questions sont :
- Est-il possible de le faire via des substitutions ?
- Y-a-t-il un autre moyen plus simple ?
Merci
Dernière modification par Tawal (Le 26/01/2023, à 18:56)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#2 Le 22/01/2023, à 15:30
- ylag
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Bonjour,
Au risque de dire une grosse bêtise, peut-être avec une commande sed ?
Source : Supprimer les espaces dans une chaine de caractères
A+
Hors ligne
#3 Le 22/01/2023, à 15:43
- Watael
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
pourquoi pas :
$ read -ra ar <<<"$var"
$ var=${ar[@]}
?
edit: on évite d'appliquer sed sur une simple chaîne. #cf. le marteau et le moustique
Dernière modification par Watael (Le 22/01/2023, à 15:54)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 22/01/2023, à 16:02
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Oui tout à fait Watael.
Ma solution de départ (ne voulant que le 1er mot du retour de ma commande) :
$ readarray -td" " -n1 Tab < <(ma commande ici)
$ echo "${Tab[0]}" # ou ${Tab[*]} ou ${Tab[@]} vu qu'il n'y a qu'un seul élément
Mais bon, je cherchais par la substitution ...
Edit: Car ma solution n'est pas viable.
J'ai testé ce que tu me dis, c'est parfait ... comme d'habitude
Merci.
Dernière modification par Tawal (Le 22/01/2023, à 16:16)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#5 Le 22/01/2023, à 16:14
- kamaris
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Si les mots de la phrase ne sont séparés que par une espace (ou que tu ne veux pas conserver les espacements supplémentaires), echo $var (sans guillemets) te donne le résultat, non ?
Hors ligne
#6 Le 22/01/2023, à 16:29
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
@kamaris :
Pas tout à fait :
$ a="A "
$ echo ${a}X
A X
$ b=$a
$ echo ${b}X
A X
$
Edit:
Oups, si ça fonctionne :
$ a=" A "
$ b=$(echo $a)
$ echo "${b}X"
AX
$
Dernière modification par Tawal (Le 22/01/2023, à 16:34)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#7 Le 22/01/2023, à 16:35
- kamaris
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Certes, mais j'ai bien dit echo $var, pas echo ${var}X.
Donc
$ var=$(echo $var)
$ echo "${var}X"
des espaces au début et des espaces à la fin.X
Hors ligne
#8 Le 22/01/2023, à 17:01
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Il y aurait donc une utilité à ce genre de chose :
ret="$(echo $(commande))"
Ce n'est pas un UUOEcho
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#9 Le 22/01/2023, à 17:08
- kamaris
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Non, mais c'est du UUOQuotes
Hors ligne
#10 Le 22/01/2023, à 17:10
- Watael
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
c'est quoi cette commande mystérieuse, qui fait ces sorties pourries ?
Dernière modification par Watael (Le 22/01/2023, à 17:13)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#11 Le 22/01/2023, à 17:48
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Je suis presque d'accord avec toi.
Mais ça m'embête car ça vient de moi
C'est le retour d'une boite zenity (liste) dans laquelle j'ai dû, par souci d'esthétique, insérer des espaces.
Donc pour résoudre mon souci :
ret=$(echo $(zenity --list ...))
ret="${ret%% *}"
Tout simplement, mais shellcheck gueule :
rep=$(echo $rep)
^----------^ SC2116: Useless echo? Instead of 'cmd $(echo foo)', just use 'cmd foo'.
^--^ SC2086: Double quote to prevent globbing and word splitting.
Edit:
Ah mais non en fait. On perd le code retour de la commande.
Je préfère donc :
rep=$(zenity --list ...)
code=$?
rep=$(echo $rep)
rep="${rep%% *}"
Dernière modification par Tawal (Le 22/01/2023, à 18:03)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#12 Le 22/01/2023, à 18:05
- kamaris
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Tu peux dire à shellcheck de se taire exceptionnellement car comme il le dit lui-même dans le wiki, il y a des exceptions: https://github.com/koalaman/shellcheck/wiki/SC2116
Mais il te donne peut-être aussi une manière de traiter ce cas :
set -- $(zenity --list ...)
echo "The first word is '$1'"
Hors ligne
#13 Le 22/01/2023, à 19:17
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Et je récupère le code retour ainsi :
$ set -- $(echo done; EcKo) $?
EcKo: command not found
$ echo "$@"
done 127
$ eval a="\$$#"
$ echo "$a"
127
$
?
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#14 Le 22/01/2023, à 19:33
- kamaris
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
set -- $(zenity --list ...) $?
rep=$1
code=${@: -1}
Hors ligne
#15 Le 22/01/2023, à 20:32
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Arff, j'avais essayé sans l'espace dans
code=${@: -1}
.
D'ailleurs, pourquoi faut-il cet espace ?
Edit:
Sinon, oui, c'est bien mieux
Dernière modification par Tawal (Le 22/01/2023, à 20:33)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#16 Le 22/01/2023, à 20:41
- kamaris
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
> D'ailleurs, pourquoi faut-il cet espace ?
Il y a confusion syntaxique avec un autre développement de paramètre sinon (valeur par défaut).
Hors ligne
#17 Le 22/01/2023, à 21:50
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Oki, merci
Bizarrement, dans un terminal tout neuf :
$ echo "${@: -1}"
bash
$ echo "$@"
$
Pour aller plus loin :
$ cat t
#!/bin/bash
echo "${@: -1}"
$
$ ./t
./t
$ func(){ echo "${@: -1}"; }
$ func
bash
$ func 1 2 der
der
$
Edit:
C'est un peu comme :
Si $@ = rien alors ${@: -1}=$0
Dernière modification par Tawal (Le 22/01/2023, à 22:06)
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#18 Le 22/01/2023, à 23:17
- kamaris
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Oui en fait il n'y a que $@ qui est un cas particulier, qui équivaut à ${@:1} au lieu de ${@:0} comme pour un tableau normal.
Mais pour le reste c'est conforme à ce qui se passe avec un tableau normal :
$ a=1
$ echo ${a[@]: -1}
1
$ a=(1 2 3)
$ echo ${a[@]: -1}
3
Par contre
$ echo ${a[@]:0}
1 2 3
$ echo ${a[@]:1}
2 3
$ set -- 1 2 3
$ echo ${@:0}
bash 1 2 3
$ echo ${@:1}
1 2 3
Hors ligne
#19 Le 24/01/2023, à 13:55
- Hizoka
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Salut, j'ai survolé le truc mais :
test=" oui non "
test="${test/#*([[:space:]])/}"
test="${test/%*([[:space:]])/}"
echo "_${test}_"
#_oui non_
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#20 Le 26/01/2023, à 18:55
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Alors ça, j'aime bien
Merci.
Très belle syntaxe ... que je ne trouvais pas.
Merci encore, pile poil ce que je cherchais.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#21 Le 26/01/2023, à 21:45
- pingouinux
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Bonsoir,
Avec sed :
$ var=" aaa bbb "
$ var=$(sed -r 's/^\s+|\s+$//g' <<<"$var")
$ echo "=$var="
=aaa bbb=
Hors ligne
#22 Le 27/01/2023, à 05:22
- Tawal
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Bah, je trouve que dégainer sed pour si peu, c'est utiliser un tank pour écraser une mouche.
Le savoir n'a d’intérêt que si on le transmet.
Useless Use of Cat Award
Filenames and Pathnames in Shell: How to do it Correctly
À chaque problème sa solution, à chaque solution son moyen, si pas de moyen, toujours le problème !
Hors ligne
#23 Le 27/01/2023, à 06:57
- iznobe
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
Bonjour , sinon pour ne laisser qu ' un seul espace entre chaque mot au milieu en + au cas ou :
iznobe@iznobe-PC:~$ i=" test pouet retest "
iznobe@iznobe-PC:~$ j=$( echo $i | sed 's@ */ *@/@g' )
iznobe@iznobe-PC:~$ echo "$j"
test pouet retest
iznobe@iznobe-PC:~$
sinon , ce que je trouve de plus simple :
iznobe@iznobe-PC:~$ i=" test pouet retest "
iznobe@iznobe-PC:~$ j=$(echo $i)
iznobe@iznobe-PC:~$ echo "$j"
test pouet retest
iznobe@iznobe-PC:~$
Dernière modification par iznobe (Le 27/01/2023, à 07:01)
retour COMPLET et utilisable de commande
MSI Z490A-pro , i7 10700 , 32 GB RAM .
Hors ligne
#24 Le 27/01/2023, à 09:20
- Hizoka
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
@Tawal : je savais que ça allait te plaire
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#25 Le 27/01/2023, à 09:55
- pingouinux
Re : [Résolu] [Bash] Enlever les 'espaces' en début et fin d'une variable.
@Hizoka #19 :
Pour ta solution, il faut préciser que l'option extglob doit être activée :
shopt -s extglob
Hors ligne