如何从 stdout 传递值作为下一个命令的参数

how to pass values from stdout as parameter for the next command

我想 svn blame 包含 "todo | fixme" 的代码行 我有脚本的一般流程,但很难将其组合成一个

找到 "todo"

的行
grep --color -Ern --include=*.{php,html,phtml} --exclude-dir=vendor "todo|TODO|FIXME" .

怪那行代码

svn blame ${file} | cat -n |grep ${linenumber}

我可以使用 awk 从第一个命令中获取 $file 和 $linenumber,但我不知道如何将使用 awk 提取的值通过管道传输到第二个命令中。

我缺少将这些命令组合成一个命令的粘合剂 "script" (- :

您可以使用 awk 构建命令,然后将其通过管道传输到 bash:

grep --color -Ern --include=*.{php,html,phtml} --exclude-dir=vendor "todo|TODO|FIXME" . |\
awk -F: '{printf "svn blame \"%s\" | cat -n | grep \"%s\"\n", , }'

每个输入行打印一个命令,格式如下:

svn blame "${file}" | cat -n | grep "${linenumber}"

变量被替换。当你执行上面的命令时,它们只会打印到 shell,你可以确认一切是否正确。如果是,将最后一个管道添加到输出重定向到 bash 的命令的输入。完整的命令如下所示:

grep --color -Ern --include=*.{php,html,phtml} --exclude-dir=vendor "todo|TODO|FIXME" . |\
awk -F: '{printf "svn blame \"%s\" | cat -n | grep \"%s\"\n", , }' | bash

一个小通知:我想你想在第一个命令中打印行号提取器,是吗?但是 grep ${linenumber} 只是给出包含 字符串 ${linenumber} 的行 。要仅打印行号,请使用该命令:sed -n "2p" 例如打印行号 2。完整的命令将如下所示:

grep --color -Ern --include=*.{php,html,phtml} --exclude-dir=vendor "todo|TODO|FIXME" . |\
awk -F: '{printf "svn blame \"%s\" | cat -n | sed -n \"%sp\"\n", , }' | bash