web-dev-qa-db-fra.com

Un moyen Unix simple de parcourir des chaînes délimitées par des espaces?

J'ai un fichier, appelé file_list, contenant des chaînes délimitées par des espaces, chacune étant le nom d'un fichier à traiter. Je souhaite maintenant parcourir tous les noms de fichiers et les traiter un par un. Le pseudocode est

for every filename in file_list
    process(filename);
end

J'ai trouvé une solution plutôt maladroite, qui est

  1. charger le fichier dans une variable par filenames='cat file_list'
  2. compter le nombre d'espaces, N, par tr -cd ' ' <temp_list | wc -c
  3. boucle de 1 à N et analyse par espace chaque nom de fichier avec cut

Existe-t-il une manière plus simple/plus élégante de procéder?

16
Sibbs Gambling

La façon la plus simple de le faire est une astuce classique qui est dans le Bourne Shell depuis un certain temps.

for filename in `cat file_list`; do
  # Do stuff here
done
19
randomusername

Vous pouvez modifier le fichier pour que les mots soient séparés par des lignes plutôt que par des espaces. De cette façon, vous pouvez utiliser la syntaxe typique:

while read line
do
   do things with $line
done < file

Avec tr ' ' '\n' < file vous remplacez les espaces par de nouvelles lignes, pour que cela fasse:

while read line
do
   do things with $line
done < <(tr ' ' '\n' < file)

Tester

$ cat a
hello this is a set of strings
$ while read line; do echo "line --> $line"; done < <(tr ' ' '\n' < a)
line --> hello
line --> this
line --> is
line --> a
line --> set
line --> of
line --> strings