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.


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.


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 

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!


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.)


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?


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.