使用 xargs 修复了最后一个参数

使用 xargs 修复了最后一个参数

是否可以使用 xargs 调用命令,以便修复命令的最后一个参数?

我的尝试:

printf '%s\n' a b c d | xargs -I{} echo {} LAST

最终做

echo a LAST  
echo b LAST  
echo c LAST  
echo d LAST  

我想要 xargs 调用

echo a b c d LAST
#fit as many as you can but always finish wiht LAST

这是否可以做到,最好以便携式方式实现?

答案1

太长;博士;这就是你如何可以便携地做到这一点,-I而无需其他损坏的花哨选项:

$ echo a b c d f g | xargs -n 2 sh -c 'echo "$@" LAST' sh
a b LAST
c d LAST
f g LAST

$ seq 1 100000 | xargs sh -c 'echo "$#" LAST' sh
23692 LAST
21841 LAST
21841 LAST
21841 LAST
10785 LAST

该选项的问题-I在于它在设计上被破坏了,而且没有办法解决它:

$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a b c d f g LAST
$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
{} LAST a b
{} LAST c d
{} LAST f g

但它们可能已被涵盖,因为标准是这么说的:

-I replstr ^[XSI] [Option Start] 插入模式:执行实用程序对于标准输入的每一行,将整行作为单个参数,将其插入到每个 replstr 出现的参数中。

而且它没有说明与-n-d选项的交互,因此他们可以自由地做任何他们想做的事情。

这是在(较旧的)FreeBSD 上的情况,不太出乎意料,但不标准:

fzu$ echo a b c d f g | xargs -I {} -n 2 echo {} LAST
a b LAST
c d LAST
f g LAST
fzu$ echo a b c d f g | xargs -I {} -n 1 echo {} LAST
a LAST
b LAST
c LAST
d LAST
f LAST
g LAST

答案2

不与xargs(单独)。如果您有一个长度不可预测的项目列表,那么如何xargs从头(=第一个元素)知道哪个元素将是最后一个?您将需要一些额外的逻辑来将所需的元素与其他元素分开。

相关内容