228 votes

Comment appliquer une commande shell à chaque ligne d'une sortie de commande?

Supposons que j'ai une sortie d'une commande (telle que ls -1 ):

 a
b
c
d
e
...
 

Je veux appliquer une commande (disons echo ) à chacun, à son tour. Par exemple

 echo a
echo b
echo c
echo d
echo e
...
 

Quelle est la façon la plus simple de faire cela à bash?

266voto

Michael Mrozek Points 44120

Il est probablement plus facile d’utiliser xargs . Dans ton cas:

 ls -1 | xargs -L1 echo
 

208voto

Trey Hunner Points 3027

Vous pouvez utiliser une opération de préparation de base sur chaque ligne:

 ls -1 | while read line ; do echo $line ; done
 

Ou vous pouvez diriger la sortie vers sed pour des opérations plus complexes:

 ls -1 | sed 's/^\(.*\)$/echo \1/'
 

15voto

BASH FAQ entrée # 1

BASH Pitfalls entry # 1

11voto

Michael Aaron Safyan Points 45071

Vous pouvez utiliser une boucle for :

pour fichier dans *; faire
   echo "$ file"
terminé

Notez que si la commande en question accepte plusieurs arguments, l'utilisation de xargs est presque toujours plus efficace, car elle ne doit générer que l'utilitaire en question une fois au lieu de plusieurs fois.

9voto

Lukasz Daniluk Points 193

Vous pouvez réellement utiliser sed pour le faire, à condition que ce soit GNU sed.

 ... | sed 's/match/command \0/e'
 

Comment ça marche:

  1. Correspondance de remplacement avec correspondance de commande
  2. Lors de la substitution, exécuter
  3. Remplace la ligne substituée par la sortie de la commande.

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