2

По умолчанию xargs множество строк своего ввода и передаст их указанной команде. Например:

echo -e 'line 1\nline 2\nline 3' | xargs echo 

результаты в

line 1 line 2 line 3

Поскольку аргументы отправляются одной команде echo (в пределах длины командной строки).

Иногда вы хотите использовать замещающую строку, чтобы поместить аргументы где-то еще в команде, а не в конец:

echo -e 'line 1\nline 2\nline 3' | xargs -Ix echo x DONE
line 1 DONE
line 2 DONE
line 3 DONE

Теперь xargs заменяет только один аргумент на каждый вызов эха, потому что, как говорится на странице руководства, "-I подразумевает -L 1 ...". Это, вероятно, правильное поведение для типичного случая, но есть ли способ переопределить его, поэтому я получаю line 1 line 2 line 3 DONE в качестве вывода?

Обратите внимание, что мой пример только иллюстративный - мне не очень интересны не-xargs способы решения этой проблемы.

3 ответа3

2

Я не знаю опции xargs которая сделает это, но вы можете добиться чего-то похожего с помощью вызова bash -c:

$ echo -e "line 1\nline    2\nline 3" | xargs bash -c 'echo "${@}" DONE' _
line 1 line 2 line 3 DONE

Обратите внимание, что xargs не предоставляет строки в качестве аргументов, даже если вы указали -L . Возможно, вы захотите использовать -d чтобы указать, что новая строка разделяет элементы (я думаю, только gnu xargs). Сравните следующее:

$ echo -e "line 1\nline    2\nline 3" |
  xargs bash -c 'printf "<%s>\n" "${@}" DONE' _
<line>
<1>
<line>
<2>
<line>
<3>
<DONE>

$ echo -e "line 1\nline    2\nline 3" |
  xargs -d\\n bash -c 'printf "<%s>\n" "${@}" DONE' _
<line 1>
<line    2>
<line 3>
<DONE>
1

Преобразуйте символы новой строки в терминаторы \nul , затем используйте xargs -0

$ echo -ne 'line 1\nline 2\nline 3\n' | tr '\n' '\0' | xargs -0 -Ix echo x DONE
line 1 DONE
line 2 DONE
line 3 DONE
-1

Если я понимаю ваш вопрос, я думаю, что вы просто хотите преобразовать переводы строки в разделитель.

echo -ne 'foo\nbar\nbaz' | tr '\n' '' | xargs -I {} echo {} DONE

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .