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

41

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

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

Корнель
источник
Что вы пытаетесь достичь? Там может быть другой способ сделать это.
Приостановлено до дальнейшего уведомления.
@Dennis Я использую его для разных вещей, часто в конвейере с grep, sed, очень простым awk и т. Д., Главным образом для параллелизации исполнения. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4слишком много, чтобы напечатать по сравнению с ls *.foo | xargs -P4.
Корнель
Сценарии и функции - это два отличных способа сократить объем печати.
Приостановлено до дальнейшего уведомления.
Это так вопрос, не так ли?
Чарльз Стюарт

Ответы:

17

Нечто подобное

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

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

hurfdurf
источник
38
tr '\n' '\0'тоже работает
Корнель
2
Perl является излишним для одного персонажа. trбыстрее как для процессора, так и для ваших пальцев.
Привет, мир,
54

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

ls *foo | xargs -d '\n' -P4 foo 
Джеймс
источник
Я имею alias xxargs="xargs -d '\n'"в моем bashrc. Так что я могу просто делать такие вещи:grep -IRl foo | xxargs sed -i s/foo/bar/g
Тайлер
4
Это действительно должен быть принятый ответ. Не нужно вырывать Perl. Хотя trэто тоже хорошая идея.
Этеш Чоудхури
3
brew install findutilsи gxargsбыло именно то, что мне нужно на OS X, спасибо.
Брэд Кох
5

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

Я должен опубликовать вопрос на SO о плюсах и минусах циклов xargs и while-read ... готово!

Чарльз Стюарт
источник
2
Это может только подражать xargs -n1 -d'\n', а не весь xargs.
Привет, мир,
@HelloWorld - Вы можете достаточно легко объединить аргументы, чтобы вы могли имитировать, используя xargs -n$Nлишь немного дополнительных сценариев.
Чарльз Стюарт
Да, я из первых рук, это просто замечание, которое стоит упомянуть.
Привет, мир,
Это именно то, что я делаю! Кроме того, вы можете использовать readопции, такие как чтение большего количества слов в отдельных переменных или изменить разделитель с помощью IFS=' '.
Цезарсоль
0

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

Джонатан Леффлер
источник
-1

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

Омар Аль-Итави
источник
Если fileсодержит пробелы и символы новой строки, то результат этой команды сделает невозможным различие между ними, которое, кажется, идет в направлении, противоположном тому, о котором спрашивает этот вопрос
Max Nanasy