Je veux me scinder 'hello'
dans h e l l o
un tableau en utilisant uniquement bash, je pourrais le faire dans sed avec sed 's/./& /g'
mais je veux savoir comment diviser une chaîne en un tableau dans Bash quand je ne sais pas ce que serait le délimiteur, ou le délimiteur est tout caractère unique. Je ne pense pas pouvoir l'utiliser ${i// /}
sans créativité car le délimiteur est un inconnu, et je ne pense pas que cette expression accepte l'expression régulière. J'ai essayé d'utiliser BASH_REMATCH avec [[string = ~ ([az].). *]] Mais cela ne fonctionne pas comme prévu. Quelle est la bonne façon d'utiliser uniquement bash pour accomplir un string.split()
type de comportement? La raison en est que j'essaie d'écrire l'utilitaire rev dans tous les bash:
while read data; do
word=($(echo $data|tr ' ' '_'|sed 's/./& /g'))
new=()
i=$((${#word[@]} - 1))
while [[ $i -ge 0 ]]; do
new+=(${word[$i]})
(( i-- ))
done
echo ${new[@]}|tr -d ' '|tr '_' ' '
done
Mais j'ai utilisé tr et sed, je veux savoir comment faire le split correctement et ensuite je vais le réparer pour être tout bash. Juste pour le fun.
[[ $string =~ ${string//?/(.)} ]]
sera définiBASH_REMATCH[]
comme requis, voir ma réponse à la question sur laquelle Peter Mortensen établit un lien pour une explication.Réponses:
Production:
ou (veuillez noter les commentaires)
Production:
la source
while read -N 1 c; do a+=("$c"); done <<< "$s"
. Le-N
permet de lire même les nouvelles lignes, et les guillemets("$c")
évitent l'expansion des chemins d'accès (et certains autres problèmes).while read -N 1 c; do a+=("$c"); done <<< "$s"x
puis effacer le dernier saut de ligne et x ajouté:unset a[${#a[@]}-1]; unset a[${#a[@]}-1]
.Pour diviser la chaîne en un tableau de caractères, avec un délimiteur nul, vous pouvez:
Avec un délimiteur autre que null, vous pouvez:
la source
IFS
peut être réglé, vous pouvez le faire simplement:IFS=',' arr=($str)
.Juste pour le plaisir (et autres coquilles) autre variante:
Et vérifie
imprimera
la source
Méthode 1:
Bon mot:
Code développé:
Méthode 2:
Bon mot:
Code développé:
Merci à @cuonglm par sa suggestion.
En effet, vous pouvez utiliser
$REPLY
c'est la variable par défaut oùread
lit l'entrée.la source
$REPLY
au lieu dechar
variable.