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 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é sad

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 smile

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 tongue
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 tongue


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 wink

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 tongue
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
$

? hmm


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 wink

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 smile

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 smile
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 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 smile


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