Como aplicar o comando shell a cada linha de uma saída de comando?

Suponha que eu tenha alguma saída de um comando (como ls -1 ):

 a b c d e ... 

Eu quero aplicar um comando (digamos, echo ) a cada um, por sua vez. Por exemplo

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

Qual é a maneira mais fácil de fazer isso no bash?

Provavelmente é mais fácil usar xargs . No seu caso:

 ls -1 | xargs -L1 echo 

Você pode usar uma operação pré-básica básica em cada linha:

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

Ou você pode canalizar a saída para sed para operações mais complexas:

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

Você pode usar um loop for :

 para arquivo em *;  Faz
    echo "$ file"
 feito

Observe que, se o comando em questão aceitar vários argumentos, o uso de xargs é quase sempre mais eficiente, pois ele precisa gerar o utilitário em questão uma vez, em vez de várias vezes.

Você pode usar sed para fazer isso, desde que seja o GNU sed.

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

Como funciona:

  1. Substituir correspondência com correspondência de comando
  2. No comando de substituição de execução
  3. Substitua a linha substituída pela saída do comando.
 for s in `cmd`; do echo $s; done 

Se o cmd tiver uma saída grande:

 cmd | xargs -L1 echo 

O xargs falha com barras invertidas, citações. Precisa ser algo como

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

Opção xargs -0:

 -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 os itens com caracteres de nova linha, então tr traduz em caracteres nulos.

Essa abordagem é cerca de 50 vezes mais lenta do que iterar manualmente for ... (veja a resposta de Michael Aaron Safyan ) (3.55s vs. 0.066s). Mas para outros comandos de input como localizar, localizar, ler de um arquivo ( tr \\n \\0 ) ou similar, você tem que trabalhar com xargs como este.

Melhor resultado para mim:

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