我想责备包含“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提取的值传递到第二个命令。
我错过了将这些命令组合成一个“脚本”的粘合剂( - :
答案 0 :(得分:2)
您可以使用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", $1, $2}'
每个输入行打印一个命令,格式如下:
svn blame "${file}" | cat -n | grep "${linenumber}"
替换varibales。当您执行上述命令时,它们仅打印到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", $1, $2}' | bash
小通知:我想你想在第一个命令中打印行号extracterd,不是吗?但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", $1, $2}' | bash