web-dev-qa-db-fra.com

Xargs séparés par des sauts de ligne

Est-il possible de faire xargs utiliser niquement newline comme séparateur? (en bash sous Linux et OS X si ça compte)

Je connais -0 peut être utilisé, mais c'est PITA car toutes les commandes ne prennent pas en charge les sorties délimitées par NUL.

44
Kornel

Quelque chose dans le sens de

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

devrait marcher.

19
hurfdurf

GNU xargs (par défaut sous Linux; installez findutils depuis MacPorts sous OS X pour l'obtenir) prend en charge -d qui vous permet de spécifier un délimiteur personnalisé pour la saisie, afin que vous puissiez faire

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

Avec Bash, je préfère généralement éviter les xargs pour tout ce qui est le moins délicat, en faveur des boucles en lecture. Pour votre question, while read -ar LINE; do ...; done fait le travail (n'oubliez pas d'utiliser la syntaxe de tableau avec LINE, par exemple, ${LINE[@]} pour toute la ligne). Cela ne nécessite aucune astuce: par défaut, read utilise simplement \n comme caractère de fin de ligne.

Je devrais poster une question sur SO sur les avantages et les inconvénients des xargs par rapport aux boucles en lecture ... fait!

5
Charles Stewart

Qu'en est-il de cat file | xargs | sed 's/ /\n/ig' ceci convertira les espaces en sauts de ligne, en utilisant les outils bash Linux standard.

0
Omar Al-Ithawi

Pas avec la version standard. J'ai une version piratée qui fait ça - je l'ai utilisée avant de connaître 'find ... -print0 | xargs -0 ... '. Contactez-moi si vous voulez une copie - voir mon profil. (Pas de science de fusée - cependant, cela fait à peu près le travail. Ce n'est pas une réplique complète de xargs.)

0
Jonathan Leffler