如何在 Bash 中的命令的前一个 xargs 管道的 grep 输出上运行类似 xargs 的命令

时间:2021-05-18 05:31:20

标签: bash unix terminal grep xargs

出于好奇,我试图了解这里发生的事情,尽管我可以复制并粘贴终端的输出来做我需要做的事情。以下命令不打印任何内容。

ls /opt/local/var/macports/registry/portfiles -1 | sed 's/-.*//g' | sort -u | parallel "sudo port -N install" {} 2>&1 | grep -Po "Use '\K.*(?=')" | parallel "{}"

我调用 ls 的目录包含一堆文件名,以我想提取的字符串开头,以第一个破折号结尾(所以 stringexample-4.2009 管道 stringexample 进入并行 (像 xargs 但要运行每行单独)。运行命令 sudo port install <stringexample> 后,我得到如下错误输出:

Unable to activate port <stringexample>. Use 'port -f activate <stringexample>' to force the activation.

现在,我希望运行 port -f activate <stringexample>。但是,我似乎无法对到达终端的输出 port -f activate gettext 做任何事情。

我什至不能执行 ... | grep -Po "Use '\K.*(?=')" | xargs echo... | grep -Po "Use '\K.*(?=')" >> commands_to_run.txt(文件的输出流只创建一个空文件),尽管命令的部分较短:

ls /opt/local/var/macports/registry/portfiles -1 | sed 's/-.*//g' | sort -u | parallel "sudo port -N install {}" 2>&1 | grep -Po "Use '\K.*(?=')"

将命令打印到终端。为什么管道操作员在这里不起作用?如果我希望运行的命令正在输出到终端,那么肯定有一种方法可以捕获它们。

0 个答案:

没有答案
相关问题