Нові рядки xargs


40

Чи можна 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

повинен працювати.


38
tr '\n' '\0'працює теж.
Корнель

2
perl є надмірним для одного символу. trшвидше і для процесора, і для ваших пальців.
Hello World

52

findutilsXargs GNU (за замовчуванням в Linux; встановити з MacPorts в OS X, щоб отримати його) підтримує, -dщо дозволяє вказати спеціальний роздільник для введення, щоб ви могли це зробити

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

У мене alias xxargs="xargs -d '\n'"в башерці. Тож я можу просто робити такі речі:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl

4
Це дійсно має бути прийнятою відповіддю. Не потрібно вибивати перл. Хоча trце теж гарна ідея.
Ehtesh Choudhury

3
brew install findutilsі gxargsбуло саме те, що мені потрібно в ОС X, дякую.
Бред Кох

5

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

Я повинен поставити запитання на ТАК про плюси і мінуси xargs проти циклів під час читання ... зроблено!


2
Це може наслідувати тільки xargs -n1 -d'\n', і не ціле xargs.
Hello World

@HelloWorld - Ви можете згрупувати аргументи досить легко, тож зможете імітувати xargs -n$Nтакож лише трохи зайвих сценаріїв.
Чарльз Стюарт

Так, я серед прихильників, це лише зауваження, яке варто згадати.
Hello World

Це саме те, що я роблю! Крім того, ви можете скористатися readпараметрами, наприклад, читати більше слів в окремих змінних або змінювати роздільник IFS=' '.
цезарсол

0

Не зі стандартною версією. У мене є зламана версія, яка це робить - я використовував її, перш ніж я знав про " find ... -print0 | xargs -0 ...". Якщо вам потрібна копія, зв’яжіться зі мною - дивіться мій профіль. (Ніякої ракетної науки - це лише робота з цим завданням. Це не повна репліка xargs.)


0

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


Якщо fileмістяться пробіли та нові рядки, то результат цієї команди унеможливить їх розмежування, що, здається, йде в зворотному напрямку, ніж запитує це запитання
Макс Нанасі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.