Bash

如何使用帶有 xargs 的 echo 或 printf 來遍歷文件中的列表?

  • July 19, 2021

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$ 

但這顯然沒有正確讀取文件。

除非太尷尬,否則寧願使用echoover 。printf

另一種嘗試:

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

但不確定如何將上面的每個數字放在單獨的行上。

也可以看看:

將數組列印到文件中,數組的每個元素在 bash 的新行中

將列表/數組回顯到 xargs

$ 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了 3 次,每次執行文件中都有一個單獨的行。實用程序的參數列表中的每個{}參數都將替換為從文件中讀取的行。

如果您的文件包含帶引號的字元串

'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'

引用自:https://unix.stackexchange.com/questions/658974