将文件行读入以空格分隔的 shell 行

Moj*_*imi 11 command-line bash

我有一个名为 requirements.txt 的文件,每一行都有一个包:

package1
package2
package3
Run Code Online (Sandbox Code Playgroud)

我正在寻找一个命令,它将获取requirements.txt 的每一行并将它们连接在一行中,空格分隔。

所以基本上,我希望生成以下命令:

command package1 package2 package3
Run Code Online (Sandbox Code Playgroud)

我尝试使用 for 并申请command每一行,requirements.txt但速度要慢得多

ste*_*ver 14

您可以使用xargs, 并将分隔符设置为换行符 ( \n):这将确保参数得到正确传递,即使它们包含空格:

xargs -rd'\n' command < requirements.txt
Run Code Online (Sandbox Code Playgroud)

手册页

-r,--no-run-if-empty
如果标准输入不包含任何非空格,请不要运行该命令。通常,即使没有输入,命令也会运行一次。此选项是 GNU 扩展。

--delimiter=delim,-d delim
输入项以指定字符结束。


des*_*ert 10

您可以简单地使用bash重定向和命令替换来获取文件内容作为命令的参数:

command $(<file)
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为不仅空格是一个有效的分词字符,而且换行符也是如此——你不需要替换任何东西。但是,在行的情况下,您将收到一个关于 shellARG_MAX限制的错误(就像使用替换解决方案一样)。使用printf内置的参数和一个列表xargs从中内置命令行来解决如下:

printf "%s\0" $(<file) | xargs -0 command
Run Code Online (Sandbox Code Playgroud)

请注意,这些方法都不适用于包含空格或通配符的行(当然除了换行符) - 幸运的是包名不适用(AFAIK)。如果行中有空格或通配符,xargs请使用(请参阅此答案)或parallel(请参阅此答案)。