Frage Newline-getrennte Xargs


Ist es möglich zu machen? xargs benutzen nur Newline als Trennzeichen? (in bash auf Linux und OS X, wenn das wichtig ist)

Ich kenne -0 kann verwendet werden, aber es ist PITA, da nicht jeder Befehl NUL-begrenzte Ausgabe unterstützt.


34
2018-03-31 00:37


Ursprung


Was willst du erreichen? Es kann einen anderen Weg geben, um darüber zu gehen. - Dennis Williamson
@Dennis nutze ich für verschiedene Dinge, oft in Pipeline mit grep, sed, sehr einfachen awk usw., meist parallel zur Ausführung. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4 ist viel zu viel verglichen mit ls *.foo | xargs -P4. - Kornel
Skripte und Funktionen sind zwei ausgezeichnete Möglichkeiten, um das Tippen zu reduzieren. - Dennis Williamson
Das ist eine SO Frage, oder? - Charles Stewart


Antworten:


Etwas in der Art von

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

sollte arbeiten.


14
2018-03-31 01:39



tr '\n' '\0' funktioniert auch. - Kornel
Perl ist Overkill für ein einzelnes Zeichen. tr ist schneller sowohl für die CPU und für Ihre Finger. - Hello World


GNU xargs (Standard unter Linux; installieren findutils von MacPorts auf OS X, um es zu bekommen) unterstützt -d Mit dieser Option können Sie ein benutzerdefiniertes Trennzeichen angeben für die Eingabe, so können Sie tun

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

48
2018-04-04 12:42



ich habe alias xxargs="xargs -d '\n'" in meinem Bashrc. Also kann ich einfach so etwas tun: grep -IRl foo | xxargs sed -i s/foo/bar/g - tylerl
Das sollte wirklich die akzeptierte Antwort sein. Keine Notwendigkeit, Perl auszubrechen. Obwohl tr ist auch eine gute Idee. - Ehtesh Choudhury
brew install findutils und gxargs war genau das, was ich unter OS X brauchte, danke. - Brad Koch


Mit Bash bevorzuge ich im Allgemeinen die Vermeidung von Xargs für alles, was ein bisschen knifflig ist, zugunsten von While-Read-Loops. Für deine Frage, while read -ar LINE; do ...; done macht den Job (denken Sie daran, Arraysyntax mit LINE zu verwenden, z. B. ${LINE[@]} für die ganze Linie). Dies erfordert keine Tricks: Standardmäßig wird nur gelesen \n als Zeilenabschlusszeichen.

Ich sollte eine Frage zu SO über die Vor- und Nachteile von xargs vs. while-read loops stellen ... erledigt!


4
2018-04-01 11:20



Dies kann nur emulieren xargs -n1 -d'\n'und nicht das Ganze xargs. - Hello World
@HelloWorld - Sie können Argumente einfach zusammen bündeln, damit Sie simulieren können xargs -n$N auch mit nur ein bisschen extra Scripting. - Charles Stewart
Ja, ich gehöre zu den Hochwahlen, es ist nur eine erwähnenswerte Bemerkung. - Hello World
Genau das tue ich! Plus, können Sie die verwenden read Optionen, wie das Lesen mehrerer Wörter in separaten Variablen oder das Ändern des Trennzeichens mit IFS=' '. - caesarsol


Nicht mit der Standardversion. Ich habe eine gehackte Version, die das tut - ich habe sie benutzt, bevor ich davon wusste.find ... -print0 | xargs -0 ...". Kontaktieren Sie mich, wenn Sie eine Kopie wünschen - siehe mein Profil. (Keine Raketenwissenschaft - es geht nur um den Job, aber es ist kein komplettes Xargs-Replikat.)


0
2018-03-31 00:46





Wie wäre es mit cat file | xargs | sed 's/ /\n/ig' Dadurch werden Leerzeichen in Zeilenumbrüche umgewandelt, wobei standardmäßige Linux-Bash-Tools verwendet werden.


0
2017-12-05 06:32



Ob file enthält Leerzeichen und Zeilenumbrüche, dann wird das Ergebnis dieses Befehls es unmöglich machen, zwischen ihnen zu unterscheiden, was in die entgegengesetzte Richtung von dem zu gehen scheint, wonach diese Frage fragt - Max Nanasy