73 votes

xargs séparés par des lignes nouvelles

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

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

80voto

James Points 7442

GNU xargs (par défaut sous Linux ; installer findutils de MacPorts sur OS X pour l'obtenir) prend en charge -d qui vous permet de spécifier un délimiteur personnalisé pour l'entrée, donc vous pouvez faire

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

23voto

hurfdurf Points 933

Quelque chose du genre

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

devrait fonctionner.

6voto

Charles Stewart Points 650

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

Je devrais poster une question sur SO à propos des avantages et des inconvénients de xargs par rapport aux boucles while-read... C'est fait !

5voto

Peteter Points 448
$ echo "1\n2 3\n4 5 6" | xargs -L1 echo  "#"
# 1
# 2 3
# 4 5 6

2voto

Veuillez utiliser l'option -d de xargs

  --delimiter=delim, -d delim

Les éléments d'entrée sont terminés par le caractère spécifié. Le délimiteur spécifié peut être un caractère unique, un caractère d'échappement de style C tel que \n ou un code d'échappement octal ou hexadécimal. Les codes octaux et hexadécimaux sont compris comme pour la commande printf. Les caractères multi-octets ne sont pas pris en charge. Lors du traitement de l'entrée, les guillemets et les barres obliques inversées ne sont pas spéciaux ; chaque caractère de l'entrée est pris en compte en tant que tel. est pris littéralement. L'option -d désactive toute chaîne de fin de fichier, qui est traitée comme tout autre argument. Vous pouvez utiliser cette option lorsque l'entrée consiste simplement en des éléments séparés par des newlines. bien qu'il soit presque toujours préférable de concevoir votre programme pour utiliser --null lorsque cela est possible.

Exemple :

$ echo 'for arg in "$@"; do echo "arg: <$arg>"; done' > show_args
$ printf "a a\nb b\nc c\n"
a a
b b
c c
$ printf "a a\nb b\nc c\n" | xargs -d '\n' bash show_args
arg: <a a>
arg: <b b>
arg: <c c>

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X