Secondo la documentazione POSIX, xargs dovrebbe eseguire l'utilità data con argomenti delimitati da spazi o newline, e questo è ciò che accade nei tuoi primi due esempi.
Tuttavia, quando --replace (o -I ) viene utilizzato, solo le nuove righe delimiteranno gli argomenti. Il rimedio è dare xargs argomenti su righe separate:
$ printf '%s\n' a b c | xargs --max-args=1 --replace="{}" echo x "{}" y
x a y
x b y
x c y
Utilizzo delle opzioni POSIX:
printf '%s\n' a b c | xargs -n 1 -I "{}" echo x "{}" y
Ecco, do xargs non una riga ma tre. Prende una riga (al massimo) ed esegue l'utility con quella come argomento.
Nota anche che -n 1 (o --max-args=1 ) in quanto sopra non è necessario in quanto è il numero di sostituzioni effettuate da -I che determina il numero di argomenti utilizzati:
$ printf '%s\n' a b c | xargs -I "{}" echo x "{}" y
x a y
x b y
x c y
In effetti, la sezione Razionale delle specifiche POSIX su xargs dice (corsivo mio)
Il
-I,-Le-nle opzioni si escludono a vicenda . Alcune implementazioni usano l'ultima specificata se ne viene fornita più di una su una riga di comando; altre implementazioni trattano le combinazioni delle opzioni in modi diversi.
Durante il test, ho notato che la versione di OpenBSD di xargs farà quanto segue se -n e -I sono usati insieme:
$ echo a b c | xargs -n 1 -I "{}" echo x "{}" y
x a y
x b y
x c y
Questo è diverso dal xargs di GNU coreutils fa (che produce x a b c y ). Ciò è dovuto all'implementazione che accetta gli spazi come delimitatore di argomento con -n , anche se -I viene usato. Quindi, non usare -I e -n insieme (non è comunque necessario).