Как применить команду оболочки к каждой строке вывода команды?

Предположим, что у меня есть некоторый вывод из команды (например, ls -1):

a
b
c
d
e
...

Я хочу применить команду (скажем echo) к каждой из них. Например.

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

Какой самый простой способ сделать это в bash?

Ответ 1

Возможно, проще всего использовать xargs. В вашем случае:

ls -1 | xargs -L1 echo

Ответ 2

Вы можете использовать базовую операцию добавления в каждой строке:

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

Или вы можете передать вывод в sed для более сложных операций:

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

Ответ 3

Вы можете использовать для цикла:

for file in * ; do
   echo "$file"
done

Обратите внимание, что если рассматриваемая команда принимает несколько аргументов, использование xargs почти всегда более эффективно, так как оно должно полезной информации один раз вместо нескольких раз.

Ответ 4

Фактически вы можете использовать sed для этого, если это GNU sed.

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

Как это работает:

  • Заменить соответствие с совпадением команд
  • При замене выполнить команду
  • Замените замененную строку на вывод команды.

Ответ 5

for s in `cmd`; do echo $s; done

Если cmd имеет большой вывод:

cmd | xargs -L1 echo

Ответ 6

Лучший результат для меня:

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

Ответ 7

xargs терпит неудачу с обратными косыми чертами, кавычками. Это должно быть что-то вроде

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

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 завершает элементы с символами новой строки, поэтому tr преобразует их в нулевые символы.

Этот подход примерно в 50 раз медленнее, чем итерация вручную с помощью for ... (см. ответ Майкла Аарона Сафьяна) (3.55s против 0,066s). Но для других входных команд, таких как поиск, поиск, чтение из файла (tr \\n \\0 <file) или подобное, вы должны работать с xargs следующим образом.