Podle dokumentace POSIX xargs by měl spustit daný nástroj s argumenty oddělenými buď mezerami nebo novými řádky, a to je to, co se děje ve dvou vašich prvních příkladech.
Když však --replace (nebo -I ), argumenty oddělují pouze nové řádky. Náprava je dát xargs argumenty na samostatných řádcích:
$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
Použití možností POSIX:
printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y
Zde dávám xargs ne jeden řádek, ale tři. Zabere jeden řádek (maximálně) a spustí obslužný program s tímto argumentem.
Všimněte si také, že -n 1 (nebo --max-args=1 ) ve výše uvedeném není potřeba, protože jde o počet nahrazení provedených -I který určuje počet použitých argumentů:
$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y
Ve skutečnosti jde o sekci Rationale specifikace POSIX na xargs říká (můj důraz)
-I,-La-nmožnosti se vzájemně vylučují . Některé implementace používají poslední zadanou, pokud je na příkazovém řádku uvedeno více než jedna; jiné implementace zacházejí s kombinacemi možností různými způsoby.
Během testování jsem si všiml, že verze OpenBSD xargs pokud -n provede následující a -I se používají společně:
$ echo a b c | xargs -n 1 -I "{}" echo x "{}" y
x a y
x b y
x c y
To se liší od xargs GNU coreutils dělá (což vytváří x a b c y ). To je způsobeno implementací, která akceptuje mezery jako oddělovač argumentů s -n , i když -I se používá. Takže nepoužívejte -I a -n společně (stejně to není potřeba).