Lösung 1:
GNU-Xargs (Standard unter Linux; installieren Sie findutils
von MacPorts unter OS X, um es zu bekommen) unterstützt -d
Damit können Sie ein benutzerdefiniertes Trennzeichen für die Eingabe angeben, sodass Sie
ls *foo | xargs -d '\n' -P4 foo
Lösung 2:
Etwas in der Art von
alias myxargs='perl -p -e "s/\n/\0/;" | xargs -0'
cat nonzerofile | myxargs command
sollte funktionieren.
Lösung 3:
Bei Bash ziehe ich es im Allgemeinen vor, xargs für alles, was am wenigsten knifflig ist, zugunsten von While-Read-Schleifen zu vermeiden. Für Ihre Frage while read -ar LINE; do ...; done
erledigt den Job (denken Sie daran, die Array-Syntax mit LINE zu verwenden, z. B. ${LINE[@]}
für die ganze Linie). Dies erfordert keine Trickserei:Standardmäßig verwendet read nur \n
als Zeilenabschlusszeichen.
Ich sollte eine Frage zu den Vor- und Nachteilen von xargs vs. While-Read-Schleifen auf SO stellen ... fertig!
Lösung 4:
$ echo "1\n2 3\n4 5 6" | xargs -L1 echo "#"
# 1
# 2 3
# 4 5 6