Xargs séparés par une nouvelle ligne

41

Est-il possible d' xargsutiliser uniquement newline comme séparateur? (en bash sur Linux et OS X si cela compte)

Je sais qu’il -0peut être utilisé, mais c’est PITA, car chaque commande ne prend pas en charge les sorties délimitées par NUL.

Kornel
la source
Qu'est-ce que vous essayez d'accomplir? Il y a peut-être une autre façon de s'y prendre.
pause jusqu'à nouvel ordre.
@ Dennis Je l'utilise pour diverses choses, souvent en pipeline avec grep, sed, awk très basique, etc., principalement pour paralléliser l'exécution. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4est trop difficile à taper par rapport à ls *.foo | xargs -P4.
Kornel
Les scripts et les fonctions sont deux excellents moyens de réduire la dactylographie.
pause jusqu'à nouvel ordre.
Ceci est une question SO, n'est-ce pas?
Charles Stewart

Réponses:

17

Quelque chose dans le sens de

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

devrait marcher.

Hurfdurf
la source
38
tr '\n' '\0'fonctionne aussi.
Kornel
2
perl est excessif pour un seul personnage. trest plus rapide à la fois pour le processeur et pour vos doigts.
Hello World le
54

GNU xargs (valeur par défaut sous Linux; installation à findutilspartir de MacPorts sous OS X pour l’obtenir) prend en charge le support, -dce qui vous permet de spécifier un délimiteur personnalisé pour l’entrée, de sorte que vous puissiez le faire.

ls *foo | xargs -d '\n' -P4 foo 
James
la source
J'ai alias xxargs="xargs -d '\n'"dans mon bashrc. Donc, je peux juste faire des choses comme ça:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl
4
Cela devrait vraiment être la réponse acceptée. Pas besoin de sortir perl. Bien que ce trsoit une bonne idée aussi.
Ehtesh Choudhury
3
brew install findutilset gxargsétait exactement ce dont j'avais besoin sur OS X, merci.
Brad Koch
5

Avec Bash, je préfère généralement éviter xargs pour tout ce qui est le moins compliqué, en faveur des boucles while-read. Pour votre question, while read -ar LINE; do ...; donefait 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 \nle caractère de fin de ligne.

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

Charles Stewart
la source
2
Cela ne peut qu'imiter xargs -n1 -d'\n', et non le tout xargs.
Hello World le
@ HelloWorld - Vous pouvez regrouper les arguments assez facilement, de sorte que vous pouvez également simuler xargs -n$Navec seulement un peu de script supplémentaire.
Charles Stewart
Oui, je suis parmi les votants, c'est juste une remarque qui mérite d'être mentionnée.
Bonjour le monde
C'est exactement ce que je fais! De plus, vous pouvez utiliser les readoptions, comme lire plus de mots dans des variables séparées ou modifier le délimiteur avec IFS=' '.
Caesarsol
0

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

Jonathan Leffler
la source
-1

Pourquoi cat file | xargs | sed 's/ /\n/ig'ne pas convertir les espaces en nouvelles lignes à l’aide des outils bash Linux classiques?

Omar Al-Ithawi
la source
Si filecontient des espaces et des lignes, le résultat de cette commande rendra impossible la distinction entre eux, ce qui semble aller dans le sens opposé à ce que cette question demande.
Max Nanasy