输入中带有空格的行,请使用它们作为命令的引号

输入中带有空格的行,请使用它们作为命令的引号

我今天很懒,所以我正在寻找一个简单的解决方案来完成这项任务。输入有多行带空格。运行命令时必须将行放在引号中。我很确定这里已经被问过很多次了,所以请为我指出解决方案的方向。

例子:

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 运行该实用程序)。

相关内容