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;)?


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

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

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.