shell xargs按空格拆分字符串

nkcskrwz  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(170)

我有以下shell脚本:

serial_numbers=$(ddcutil detect | grep "Serial number" | awk '{print $3}' | uniq)
echo $serial_numbers | xargs -P $(echo $serial_numbers | wc -w) -I % ddcutil setvcp 10 100 --sn %

变量$serial_number包含字符串'8TRNJQ2 FGVF2Y2'xargs将这个字符串解释为一个参数,并且只产生一个ddcutil setvcp的调用。但是我希望xargs在空格处拆分字符串,所以i ~得到两个以8TRNJQ2FGVF2Y2为参数的调用。
编辑:使用-t ' '会给字符串的最后一部分带来奇怪的结果:'FGVF2Y2'$'\n'

vtwuwzda

vtwuwzda1#

如果您直接从命令中通过管道传输xargs,则它可以正常工作,但如果您使用echo传输同一命令输出的结果,则无法正常工作。
在命令中添加以下转换:

#!/bin/bash

echo $serial_numbers | tr ' ' '\n' | xargs -P $(echo $serial_numbers | wc -w) -I % ddcutil setvcp 10 100 --sn %

xargs现在将理解您希望拆分序列号。
或者,您可以将tr放在第一行,并将分隔的序列号存储在变量中。

yc0p9oo0

yc0p9oo02#

xargs有一个-n选项,可以用来拆分单字符串输入,但是我注意到:将-I-n1一起使用会破坏其分裂行为(* 未加引号的空格不会终止输入项 * -man xargs)。因此,除了使用tr之外,另一种换行方式是使用-d显式地将分隔符传递给xargs。另外,你需要在echo中添加-n,以删除尾随的换行符,即你看到的$'\n'(它会打断后续的管道):

echo -n "a b c" | xargs -d " " -I% echo letter_%

也可以在管道中插入另一个xargs:

echo -n "a b c" | xargs -n1 | xargs -I% echo letter_%

相关问题