Newline-separierte Xargs

40

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

Ich weiß, -0dass es verwendet werden kann, aber es ist PITA, da nicht jeder Befehl eine durch NUL getrennte Ausgabe unterstützt.

Kornel
quelle
Was versuchst du zu erreichen? Möglicherweise gibt es noch einen anderen Weg.
Dennis Williamson
@Dennis Ich benutze es für verschiedene Dinge, oft in Pipeline mit grep, sed, sehr einfachen awk usw., meistens um die Ausführung zu parallelisieren. find -print0 -name \*.foo -maxdepth 1 | xargs -0 -P4ist viel zu viel zu schreiben im Vergleich zu ls *.foo | xargs -P4.
Kornel
Skripte und Funktionen sind zwei hervorragende Möglichkeiten, um das Tippen zu reduzieren.
Dennis Williamson
Dies ist eine SO-Frage, nicht wahr?
Charles Stewart

Antworten:

17

Etwas in der Art von

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

sollte arbeiten.

hurfdurf
quelle
38
tr '\n' '\0'funktioniert auch.
Kornel
2
Perl ist übertrieben für ein einzelnes Zeichen. trist schneller sowohl für die CPU als auch für Ihre Finger.
Hallo Welt
52

GNU xargs (Standard unter Linux; Installation findutilsvon MacPorts unter OS X, um es zu erhalten) unterstützt, mit -ddem Sie ein benutzerdefiniertes Trennzeichen für die Eingabe festlegen können

ls *foo | xargs -d '\n' -P4 foo 
James
quelle
Ich habe alias xxargs="xargs -d '\n'"in meinem bashrc. Also kann ich einfach so etwas machen:grep -IRl foo | xxargs sed -i s/foo/bar/g
tylerl
4
Dies sollte wirklich die akzeptierte Antwort sein. Perl muss nicht ausgebrochen werden. Ist traber auch eine gute Idee.
Ehtesh Choudhury
3
brew install findutilsund gxargswar genau das, was ich unter OS X brauchte, danke.
Brad Koch am
5

Bei Bash ziehe ich es im Allgemeinen vor, xargs für alles zu vermeiden, was am wenigsten schwierig ist, und zwar zugunsten von Leseschleifen. Erledigt bei Ihrer Frage while read -ar LINE; do ...; donedie Aufgabe (denken Sie daran, Array-Syntax mit LINE zu verwenden, z. B. ${LINE[@]}für die gesamte Zeile). Dies erfordert keinen Trick: Standardmäßig wird beim Lesen nur \ndas Zeilenendezeichen verwendet.

Ich sollte auf SO eine Frage zu den Vor- und Nachteilen von xargs vs. while-read-Schleifen stellen ... fertig!

Charles Stewart
quelle
2
Dies kann nur emulieren xargs -n1 -d'\n'und nicht das Ganze xargs.
Hallo Welt
@HelloWorld - Sie können Argumente leicht genug bündeln, um sie xargs -n$Nauch mit ein wenig zusätzlichem Skripting zu simulieren .
Charles Stewart
Ja, ich gehöre zu den Wählern, es ist nur eine erwähnenswerte Bemerkung.
Hallo Welt,
Genau das mache ich! Außerdem können Sie die readOptionen verwenden, z. B. mehrere Wörter in separaten Variablen lesen oder das Trennzeichen mit ändern IFS=' '.
Caesarsol
0

Nicht bei der Standardversion. Ich habe eine gehackte Version, die das macht - ich habe sie benutzt, bevor ich von ' find ... -print0 | xargs -0 ...' wusste . Kontaktieren Sie mich, wenn Sie eine Kopie möchten - siehe mein Profil. (Keine Raketenwissenschaft - es erledigt den Job aber fast. Es ist keine vollständige Xargs-Replik.)

Jonathan Leffler
quelle
0

Wie cat file | xargs | sed 's/ /\n/ig'sieht es damit aus, wenn Leerzeichen mit Standard-Linux-Bash-Tools in Zeilenumbrüche umgewandelt werden?

Omar Al-Ithawi
quelle
Wenn fileLeerzeichen und Zeilenumbrüche enthalten sind, wird das Ergebnis dieses Befehls eine Unterscheidung unmöglich machen. Dies scheint in die entgegengesetzte Richtung zu gehen, wie in dieser Frage
gefordert