да, как @nobody упомянул, это что-то вроде
oldfoo(?=[^"]*"([^"]*"[^"]*")*[^"]*$)
Полагаю, вам, вероятно, придется немного поиграть с экранированием "
, чтобы он правильно работал с awk / sed
если у вас есть Perl, это будет
perl -pe 's/oldfoo(?=[^"]*"([^"]*"[^"]*")*[^"]*$)/newfoo/g' whatever.txt
EDIT:
Хорошо, извините, я не знал, что sed / awk вообще не поддерживает lookahead / lookbehind. Я боюсь, что нет способа выполнить эту задачу, по крайней мере, с нетерпением.