Можно ли сделать 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.