如何使用 echo 或 printf 与 xargs 来迭代文件中的列表?

如何使用 echo 或 printf 与 xargs 来迭代文件中的列表?

闲逛xargs,如下所示:

nicholas@gondor:~/x$ 
nicholas@gondor:~/x$ xargs echo < list.txt
1 2 3
nicholas@gondor:~/x$ 
nicholas@gondor:~/x$ cat list.txt 


1
2
3


nicholas@gondor:~/x$ 

如何xargs给出如下输出:

number is 1
number is 2
number is 3

而不仅仅是当前结果的数字?

我尝试使用$带有 echo 的符号,但没有得到正确的输出。

还尝试过:

nicholas@gondor:~/x$ 
nicholas@gondor:~/x$ printf '%s\n' "${list.txt[@]}" | xargs
bash: ${list.txt[@]}: bad substitution

nicholas@gondor:~/x$ 

但这显然没有正确读取文件。

宁愿使用echooverprintf除非太尴尬。

另一种尝试:

nicholas@gondor:~/x$ 
nicholas@gondor:~/x$ xargs echo 'numbers are ${}' < list.txt
numbers are ${} 1 2 3
nicholas@gondor:~/x$ 

但不确定如何将上面的每个数字放在单独的行上。

也可以看看:

将数组打印到文件中,并在 bash 中将数组的每个元素放在新行中

将列表/数组回显到 xargs

答案1

$ xargs printf 'Number is %d\n' <file
Number is 1
Number is 2
Number is 3

这会从文件中读取单词,并一次使用尽可能多的单词调用给定的实用程序。该printf实用程序将为每组参数重用其格式字符串。

以上将最终执行

printf 'Number is %d\n' 1 2 3

如果文件中的行中有空格或制表符:

$ cat file
1 2
3 4
5 6
$ xargs printf 'Number is %s\n' <file
Number is 1
Number is 2
Number is 3
Number is 4
Number is 5
Number is 6

上面是使用文件中每个空格分隔的单词运行该实用程序的结果printf,即

printf 'Number is %s\n' 1 2 3 4 5 6
$ xargs -I {} printf 'Number is %s\n' {} <file
Number is 1 2
Number is 3 4
Number is 5 6

上面的代码运行了printf三次,每次都与您的文件分开一行。实用程序参数列表中的每个参数都{}将替换为从文件中读取的行。

如果您的文件包含带引号的字符串:

'1 2'
'3 4'
'5 6'

然后:

$ xargs printf 'Number is %s\n' <file
Number is 1 2
Number is 3 4
Number is 5 6

上面是运行等价的结果

printf 'Number is %s\n' '1 2' '3 4' '5 6'

相关内容