могут ли xargs разделять параметры? - PullRequest
9 голосов
/ 23 мая 2011
echo "'param 1' 'param 2'" | xargs -n2 -I@ echo [@] [@]

Эта команда выводит:

[param 1 param 2] [param 1 param 2]

Однако я хотел бы вывести:

[param 1] [param 2]

Есть ли способ сделать это с xargs?Я планирую использовать это с -L1, чтобы решение обрабатывало как несколько строк, так и несколько аргументов.

Ответы [ 5 ]

8 голосов
/ 03 марта 2013

Для тех, кто находит это из поиска, принятый ответ не работает для меня.

echo "'param 1' 'param 2'" | xargs -n1 | xargs -I@ echo \[@\] \[@\]

производит:

[param 1] [param 1]
[param 2] [param 2]

, который не соответствует требованиям, предъявляемым исходным постером, для чтения xargs в нескольких объектах, их разделения и отправки в одну команду («echo» в OP) в качестве отдельных параметров. Xargs не предназначен для такого рода задач!

1011 *
*

Ответ bash может работать.

p=(`echo "param1 param2"`); echo [${p[0]}] [${p[1]}]

производит:

[param1] [param2]

но это решение не работает с более чем одной строкой.


Правильное решение с использованием bash для отправки пар строк в качестве аргументов одной команде:

(echo 'param 1'; echo 'param 2'; echo 'param 3'; echo 'param 4') | while read line1; read line2; do echo "[$line1] [$line2]"; done

производит:

[param 1] [param 2]
[param 3] [param 4]


GNU Parallel ответ работает, но GNU Parallel должен быть make'd и установлен. (Версия, поставляемая с Ubuntu, не является GNU Parallel.)

4 голосов
/ 23 мая 2011
echo "'param 1' 'param 2'" | xargs -n1 | xargs -I@ echo \[@\] \[@\]

(В моей оболочке мне нужно сбежать [], ваш пробег может отличаться).

1 голос
/ 29 августа 2011

зачем втыкать xargs? Bash может справиться с этим хорошо:

p=(`echo "param1 param2"`); echo ${p[0]} ${p[1]}
0 голосов
/ 21 октября 2013

Как предложено в этом ответе , дано echo:

param1 param2

param 3 param4

Следующий канал:

... | while read line1; read line2; do echo "[$line1] [$line2]"; done

производит:

[param1] [param2]
[param3] [param4]

Если у вас есть файл myFile.txt, содержащий много строк с двумя параметрами на каждом, используйте следующую стратегию, основанную на xargsчтобы повторно использовать аргументы как $f и $g:

cat myFile.txt | xargs -n1 | while read f; read g; do echo $f $g; done
0 голосов
/ 25 мая 2011

С GNU Parallel вы можете сделать:

(echo 'param 1'; echo 'param 2') | parallel -N2 echo '\[{1}] \[{2}]'

Посмотрите вступительное видео, чтобы узнать больше: http://www.youtube.com/watch?v=OpaiGYxkSuQ

...