Назад | Перейти на главную страницу

Xargs, разделенные новой строкой

Можно ли сделать xargs использовать только новая строка как разделитель? (в bash для Linux и OS X, если это имеет значение)

Я знаю -0 можно использовать, но это PITA, поскольку не каждая команда поддерживает вывод с разделителями NUL.

GNU xargs (по умолчанию в Linux; установить findutils из MacPorts в OS X, чтобы получить его) поддерживает -d который позволяет указать настраиваемый разделитель для ввода, поэтому вы можете сделать

ls *foo | xargs -d '\n' -P4 foo 

Что-то вроде

alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command

должно сработать.

В Bash я обычно предпочитаю избегать xargs для чего-нибудь менее сложного в пользу циклов while-read. На ваш вопрос, while read -ar LINE; do ...; done выполняет свою работу (не забудьте использовать синтаксис массива с LINE, например, ${LINE[@]} для всей линии). Для этого не нужны никакие уловки: по умолчанию для чтения используются только \n как символ конца строки.

Я должен задать вопрос о плюсах и минусах xargs по сравнению с циклами чтения ... сделано!

Не в стандартной версии. У меня есть взломанная версия, которая делает это - я использовал ее, прежде чем узнал о 'find ... -print0 | xargs -0 ...'. Свяжитесь со мной, если хотите копию - см. Мой профиль. (Никакого ракетостроения - хотя он почти выполняет свою работу. Это не полная копия xargs.)

$ echo "1\n2 3\n4 5 6" | xargs -L1 echo  "#"
# 1
# 2 3
# 4 5 6

Что о cat file | xargs | sed 's/ /\n/ig' это преобразует пробелы в символы новой строки, используя стандартные инструменты Linux bash.