我今天很懒,所以我正在寻找一个简单的解决方案来完成这项任务。输入有多行带空格。运行命令时必须将行放在引号中。我很确定这里已经被问过很多次了,所以请为我指出解决方案的方向。
例子:
Aaa aaa
Bbb bbb
Ccc ccc
需要运行command "Aaa aaa" "Bbb bbb" "Ccc ccc"
。
这是关于这个问题:为什么“dnf update”时不出现“dnf groupupdate”包?
我已经提供:
# the first line is informational and redundant, thus tail
# each group is in a separate line
dnf -q group list --installed | tail -n +2 | while read group; do dnf group upgrade "$group"; done
但它将分别为每个组运行,dnf upgrade
这比一次升级所有组需要更多的时间。
答案1
引号是某些编程语言(例如 C、perl 或 sh)语法的一部分。
您不想在这些行周围加引号,您希望将这些行的内容(不带行分隔符)作为单独的参数传递给命令,而不是使用某些编程语言(例如 sh / )的语法构建代码perl 包含一些引用运算符以便稍后解释。
这就是xargs
目的:
xargs -rd '\n' -a file.list some-command --
请注意-r
, 、-d
、 和-a
是 GNU 扩展。
xargs
可能会运行some-command
多次以解决可以一次性传递的参数数量的限制。
答案2
这很丑陋,但它在 Bash 中有效:
groups=()
while read -r group; do groups+=$group; done < \
<(sudo dnf -C -q group list --installed | tail -n +2)
sudo dnf group upgrade "${groups[@]}"
答案3
我可能会选择Stéphane Chazelas 的变体如果我有 GNU 的话xargs
。但由于我的主系统上没有 GNU xargs
,我会确保在将这些行提供给以下内容之前引用这些行xargs
:
$ sed -e 's/^/"/' -e 's/$/"/' file | xargs printf '<%s>\n'
<Aaa aaa>
<Bbb bbb>
<Ccc ccc>
这假设输入中没有其他双引号。根据您的xargs
,这也可能至少执行该实用程序一次,无论输入是否为xargs
空(请参阅如果未向 xargs 提供任何输入,则不要让 xargs 运行该实用程序)。