¿Cómo aplicar el comando de shell a cada línea de un resultado de comando?

Supongamos que tengo algún resultado de un comando (como ls -1 ):

 a b c d e ... 

Quiero aplicar un comando (digamos echo ) a cada uno, a su vez. P.ej

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

¿Cuál es la forma más fácil de hacer eso en bash?

Probablemente sea más fácil usar xargs . En tu caso:

 ls -1 | xargs -L1 echo 

Puede usar una operación de anteponer básica en cada línea:

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

O puede canalizar la salida a sed para operaciones más complejas:

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

Puede usar un ciclo for :

 para el archivo en *;  hacer
    echo "$ file"
 hecho

Tenga en cuenta que si el comando en cuestión acepta múltiples argumentos, el uso de xargs es casi siempre más eficiente ya que solo debe generar la utilidad en cuestión una vez en lugar de varias veces.

Puedes usar sed para hacerlo, siempre que sea GNU sed.

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

Cómo funciona:

  1. Coincidencia sustituta con coincidencia de comando
  2. En el comando de ejecución de sustitución
  3. Reemplace la línea sustituida con la salida del comando.
 for s in `cmd`; do echo $s; done 

Si cmd tiene una salida grande:

 cmd | xargs -L1 echo 

xargs falla con barras invertidas, comillas. Tiene que ser algo así como

 ls -1 |tr \\n \\0 |xargs -0 -iTHIS echo "THIS is a file." 

xargs -0 opción:

 -0, --null Input items are terminated by a null character instead of by whitespace, and the quotes and backslash are not special (every character is taken literally). Disables the end of file string, which is treated like any other argument. Useful when input items might contain white space, quote marks, or backslashes. The GNU find -print0 option produces input suitable for this mode. 

ls -1 termina los elementos con caracteres de nueva línea, por lo que tr traduce en caracteres nulos.

Este enfoque es aproximadamente 50 veces más lento que iterar manualmente con for ... (ver la respuesta de Michael Aaron Safyan ) (3.55s frente a 0.066s). Pero para otros comandos de entrada como localizar, buscar, leer desde un archivo ( tr \\n \\0 ) o similar, debe trabajar con xargs como este.

Mejor resultado para mí:

 ls -1 | xargs -L1 -d "\n" CMD