Question Xargs séparés par une nouvelle ligne


Est-il possible de faire xargs utilisation seulement nouvelle ligne comme séparateur? (en bash sur Linux et OS X si cela compte)

je connais -0 peut être utilisé, mais il s’agit de PITA car toutes les commandes ne prennent pas en charge les sorties délimitées par NUL.


34
2018-03-31 00:37


origine


Qu'est-ce que vous essayez d'accomplir? Il y a peut-être une autre façon de s'y prendre. - Dennis Williamson
@ 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 -P4 est beaucoup trop à taper par rapport à ls *.foo | xargs -P4. - Kornel
Les scripts et les fonctions sont deux excellents moyens de réduire la dactylographie. - Dennis Williamson
Ceci est une question SO, n'est-ce pas? - Charles Stewart


Réponses:


Quelque chose dans le sens de

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

devrait marcher.


14
2018-03-31 01:39



tr '\n' '\0' fonctionne aussi. - Kornel
perl est excessif pour un seul personnage. tr est plus rapide pour le processeur et pour vos doigts. - Hello World


GNU xargs (défaut sur Linux; installer findutils de MacPorts sur OS X pour l'obtenir) -d qui vous permet de spécifier un délimiteur personnalisé pour l'entrée, afin que vous puissiez faire

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

48
2018-04-04 12:42



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
Cela devrait vraiment être la réponse acceptée. Pas besoin de sortir perl. Bien que tr C'est une bonne idée aussi. - Ehtesh Choudhury
brew install findutils et gxargs était exactement ce dont j'avais besoin sous OS X, merci. - Brad Koch


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 ...; 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, les utilisations en lecture uniquement \n comme 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 ... terminé!


4
2018-04-01 11:20



Cela ne peut qu'imiter xargs -n1 -d'\n'et pas le tout xargs. - Hello World
@HelloWorld - Vous pouvez regrouper des arguments assez facilement pour pouvoir simuler xargs -n$N aussi bien avec 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. - Hello World
C'est exactement ce que je fais! De plus, vous pouvez utiliser le read options, comme lire plus de mots dans des variables séparées ou modifier le délimiteur avec IFS=' '. - caesarsol


Pas avec la version standard. J'ai une version piratée qui fait ça - je l'ai utilisée avant de savoirfind ... -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.)


0
2018-03-31 00:46





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


0
2017-12-05 06:32



Si file contient des espaces et des nouvelles 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