Wie kann ich Xargs dazu bringen, mit stdin gut zu spielen?

7
$ seq 1 3
1
2
3
$ seq 1 3 | xargs echo
1 2 3
$

Ersetzen Sie geistig durch seq 1 3einen Befehl, der Einträge pro Zeile im Standardausgang auflistet. Wie kann ich mehr oder weniger das bekommen, was Sie erwarten würden, dh die Einträge in separaten Zeilen ( echo 1; echo 2; echo 3;)?

Sean Allred
quelle
Oft ist xargsnicht der Befehl, den Sie brauchen. Sie verwenden zwei externe Befehle seqjeweils um xargsetwas zu erreichen , dass die Shell es tun können , auf sie selbst ist. Nehmen Sie zum Beispiel die Klammererweiterung in Bash. Sie könnten dann ausstellen printf '%s\n' {1..10} , um das gewünschte Ergebnis zu erhalten
Valentin Bajrami
@ val0x00ff Mein eigentlicher Anwendungsfall ist die Implementierung eines Brewfilefor Homebrew in meinem eigenen Bootstrap-Skript . Ich bin nicht sicher, ob ich irgendwelche Funktionen der Shell verwenden kann, um die Arbeit zu erledigen.
Sean Allred
Die Funktion, die Sie dort haben nocommentund onelinedie zu einer Funktion kombiniert nocomment_oneline und gesetzt werden könntesed '/^#/d;/^.$/d' "$1" | sed -e :a -e '$!N;s/\n/ /;ta'
Valentin Bajrami
@ val0x00ff Ja, aber dann konnte ich es nicht wirklich benutzen .
Sean Allred
Ich bin mir nicht sicher, warum du es nicht kannst? Das kombiniert einfach beide Funktionen. Sie verwenden eine Funktion, um Kommentare und Leerzeilen herauszufiltern. Danach lesen Sie die Datei und fügen alle Zeilen in eine ein.
Valentin Bajrami

Antworten:

15

Normalerweise xargswerden mehrere Argumente in eine Befehlszeile eingefügt. Verwenden Sie die -nOption, um es auf jeweils ein Argument zu beschränken :

$ seq 3 | xargs -n 1 echo
1
2
3

Dokumentation

Von man xargs:

-n max-args
Verwenden Sie höchstens max-args Argumente pro Befehlszeile. Wenn die Größe (siehe Option -s) überschritten wird, werden weniger als max-args-Argumente verwendet, sofern nicht die Option -x angegeben ist. In diesem Fall wird xargs beendet.

Unterschied zwischen -nund-L

-List ähnlich, hat aber eine zusätzliche Funktion: Im Gegensatz dazu -nwerden Zeilen mit nachgestellten Leerzeichen in der nächsten Zeile fortgesetzt. Beobachten:

$ echo $'1 \n2\n3\n4'
1 
2
3
4
$ echo $'1 \n2\n3\n4' | xargs -L 1 echo
1 2
3
4
$ echo $'1 \n2\n3\n4' | xargs -n 1 echo
1
2
3
4
John1024
quelle
Ich frage mich: Wie -nund -Lunterscheiden sich in dem Anwendungsfall? Sicherlich müssen sie sich außerhalb dieses trivialen Beispiels unterscheiden.
Sean Allred
@SeanAllred -Lunterscheidet sich darin, dass es eine nachgestellte Leerzeichenfunktion hat. Ich habe gerade ein Beispiel hinzugefügt, das dies veranschaulicht. (Ihre Antwort hat meine +1)
John1024
1
Ich denke Sean meint, wann würdest du verwenden xargs -L? Wann ist die Funktion für nachgestellte Leerzeichen nützlich?
Tor Klingberg