GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Problem bei der Verwendung von xargs --max-args --replace with default delimiter

Laut POSIX-Dokumentation xargs sollte das angegebene Dienstprogramm mit Argumenten ausführen, die entweder durch Leerzeichen oder Zeilenumbrüche getrennt sind, und dies geschieht in den beiden ersten Beispielen von Ihnen.

Wenn jedoch --replace (oder -I ) verwendet wird, werden Argumente nur durch Zeilenumbrüche getrennt. Abhilfe schafft hier xargs Argumente in separaten Zeilen:

$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y

Verwendung von POSIX-Optionen:

printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y

Hier gebe ich xargs ein nicht eine Zeile, sondern drei. Es dauert (höchstens) eine Zeile und führt das Dienstprogramm mit dieser als Argument aus.

Beachten Sie auch, dass -n 1 (oder --max-args=1 ) oben wird nicht benötigt, da es sich um die Anzahl der Ersetzungen durch -I handelt das bestimmt die Anzahl der verwendeten Argumente:

$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y

Tatsächlich ist der Begründungsabschnitt der POSIX-Spezifikation auf xargs sagt (meine Betonung)

Der -I , -L , und -n Optionen schließen sich gegenseitig aus . Einige Implementierungen verwenden die zuletzt angegebene, wenn mehr als eine in einer Befehlszeile angegeben wird; andere Implementierungen behandeln Kombinationen der Optionen auf unterschiedliche Weise.

Beim Testen ist mir aufgefallen, dass die OpenBSD-Version von xargs Folgendes tun, wenn -n und -I werden zusammen verwendet:

$ echo  a b c | xargs -n 1  -I "{}" echo x "{}" y
x a y
x b y
x c y

Dies unterscheidet sich von xargs von GNU coreutils tut (was x a b c y erzeugt ). Dies liegt daran, dass die Implementierung Leerzeichen als Argumenttrennzeichen mit -n akzeptiert , obwohl -I wird genutzt. Verwenden Sie also nicht -I und -n zusammen (wird sowieso nicht benötigt).


Linux
  1. Verwendung von awk mit Spaltenwertbedingungen

  2. Verwenden von sed zum Teilen einer Zeichenfolge mit einem Trennzeichen

  3. SDL2 unter Linux mit g++ verwenden?

  4. Standard gespeicherte Arbeit mit GRUB2 machen ...?

  5. Wie fülle ich eine Datei mit FF mit dd auf?

Verwenden des Cat-Befehls unter Linux mit Beispielen

Fehler bei der Verwendung von GRANT mit IDENTIFIED by password in MySQL

Verwenden Sie Notify-Send mit Cron?

Planen Sie Jobs in Linux mit dem Befehl 'at'

Entfernen von Dateien mit rm unter Verwendung von find und xargs

Problem mit Remote-Anzeige von Java-Anwendungen