108 votes

Comment effectuer une boucle for sur chaque caractère d'une chaîne dans BASH?

J'ai une variable comme celle-ci:

 words="这是一条狗。"
 

Je souhaite créer une boucle for chacun des caractères, un à un, par exemple, d'abord character="这" , puis character="是" , character="一" , etc.

Le seul moyen que je connaisse est de sortir chaque caractère pour séparer une ligne dans un fichier, puis d'utiliser while read line , mais cela semble très inefficace.

  • Comment puis-je traiter chaque caractère d'une chaîne via une boucle for?

281voto

chepner Points 54078

Vous pouvez utiliser une boucle for traditionnelle:

 foo=string
for (( i=0; i<${#foo}; i++ )); do
  echo ${foo:$i:1}
done
 

${#foo} s'étend jusqu'à la longueur de foo . ${foo:$i:1} s'étend à la sous-chaîne à partir de la position $i de longueur 1.

56voto

Rony Points 666

Avec sed sur dash coquille de LANG=en_US.UTF-8 , les éléments suivants fonctionnent correctement:

 $ echo "你好嗎 新年好。全型句號" | sed -e 's/\(.\)/\1\n/g'
你
好
嗎

新
年
好
。
全
型
句
號
 

et

 $ echo "Hello world" | sed -e 's/\(.\)/\1\n/g'
H
e
l
l
o

w
o
r
l
d
 

Ainsi, la sortie peut être mise en boucle avec while read ... ; do ... ; done

édité pour un exemple de texte traduit en anglais:

 "你好嗎 新年好。全型句號" is zh_TW.UTF-8 encoding for:
"你好嗎"     = How are you[ doing]
" "         = a normal space character
"新年好"     = Happy new year
"。全型空格" = a double-byte-sized full-stop followed by text description
 

42voto

Tiago Peczenyj Points 1819

$ {# var} retourne la longueur de var

$ {var: pos: N} retourne N caractères de pos

comme:

 $ words="abc"
$ echo ${words:0:1}
a
$ echo ${words:1:1}
b
$ echo ${words:2:1}
c
 

il est donc facile à itérer.

autrement:

 $ grep -o . <<< "abc"
a
b
c
 

ou

 $ grep -o . <<< "abc" | while read letter;  do echo "my letter is $letter" ; done 

my letter is a
my letter is b
my letter is c
 

13voto

William Pursell Points 56211

J'ai seulement testé cela avec des chaînes ascii, mais vous pouvez faire quelque chose comme:

 while test -n "$words"; do
   c=${words:0:1}     # Get the first character
   echo character is $c
   words=${words:1}   # trim the first character
done
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X