Uma possibilidade seria passar a saída de grep
para um filtro sed
separado.
grep -l FOO "/Users/gjtorikian/blah/"* |
{ tee /dev/fd/3 |
xargs sed -i -e '/FOO/{' -e 's/FOO/BAR/g' -e 'w /dev/stdout'
} 3>&1 | sed 's/:FOO$/:BAR/'
Você pode fazer com que sed
imprima o número da linha (com o comando =
) quando encontrar uma correspondência e fazer mais pós-processamento.
Provavelmente seria mais claro usar o awk.
for x in "/Users/gjtorikian/blah/"*; do
awk '
sub(/FOO/, "BAR") {found=1; print FILENAME ":" NR ":" "BAR" >"/dev/stderr"}
1 {print}
END {exit(!found)}
' "$x" >"$x.tmp" && mv "$x.tmp" "$x"
done