Comment convertir une chaîne dans tous les espaces de Bash?

Pour le formatage, je souhaite remplacer tous les caractères d’une chaîne par des espaces.

STR="some ssortingng of unknown length" SPC=" " <--- this is what I want 

Avec l’aide de cette page , le mieux que je puisse trouver est la suivante:

 SPC=${STR//[aZ]/ } 

Mais cela ne remplace que les lettres, pas les chiffres ou les caractères spéciaux. Quel est l’espace réservé pour “n’importe quel caractère” avec ce type de remplacements de chaîne Bash?

Vous pouvez utiliser:

 str="some ssortingng of unknown length" spc="${str//[^[:space:]]/ }" 

[^[:space:]] correspondra à tout caractère non espace et le remplacera par un espace.

Vérifier:

 echo "$str" | wc -c 30 echo "$spc" | wc -c 30 

PS: Vous pouvez aussi faire:

 spc="${str//?/ }" 

pour obtenir la chaîne de même longueur contenant uniquement des espaces. ? correspond à n’importe quel caractère dans glob.

Ceci est une solution alternative (pas de regex / parsing du tout):

 STR='some ssortingng of unknown length.' # Actually 30 chars # Create an SCP var of the same length of STR filled with spaces (# updated implementation, thanks gniourf_gniourf) printf -v SCP '%*s' ${#STR} 

Test :

 echo "${STR}" # 'some ssortingng of unknown length.' echo "${SCP}" # ' ' echo "Length STR -> ${#STR}" # 'Length STR -> 30' echo "Length SCP -> ${#SCP}" # 'Length SCP -> 30' 

Comment ça marche :

La commande printf écrit dans la variable SCP une chaîne d’au moins la longueur égale au nombre de caractères de STR ( ${#STR} ).

Les astuces se trouvent dans le s non remplacé car il n’y a plus de paramètre après ${#STR} .

Exemple d’utilisation :

 printf '%*s' 3 # ' ' printf '%*s' 3 . # ' .' printf '%*s' 3 123 # '123' printf '%*s' 3 12345 # '12345'