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.


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.


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 

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!


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.)


-1

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


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.