4

i want to svn blame lines of code which include "todo | fixme" i have the general flow of the script but struggle to combine it into one

finding the lines with "todo"

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

blame the line of code

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

i could get $file and $linenumber from the first command with awk, but i dont know how to pipe the values i extract with awk into the second command.

i am missing the glue to combine these commands into one "script" (- :

braunbaer
  • 1,113
  • 1
  • 9
  • 20

1 Answers1

3

You can build the command with awk and then pipe it to 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}'

That prints one command per input line with the following format:

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

The varibales are replaces. When you execute the command as above they are only printed to the shell, that you can comfirm if everything is right. If yes add a last pipe to the in of the command that the ouput is redirected to bash. The complete command would look like this:

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

A small notice: I think you want to print the line number extracterd in the first command, aren't you? But grep ${linenumber} just gives the line containing the string ${linenumber}. To print only the linenumber use that command: sed -n "2p" to print line number 2 for example. The complete command would then look like this:

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
chaos
  • 8,162
  • 3
  • 33
  • 40