Optimising what @MattObert said:

* <kbd>y</kbd><kbd>3</kbd><kbd>i</kbd><kbd>w</kbd>
* <kbd>/</kbd>`red dog`<kbd>Enter</kbd>
* <kbd>c</kbd><kbd>3</kbd><kbd>i</kbd><kbd>w</kbd><kbd>Ctrl-r</kbd><kbd>0</kbd><kbd>Esc</kbd>
* <kbd>n</kbd><kbd>.</kbd> etc.

In detail:

* <kbd>y</kbd><kbd>3</kbd><kbd>i</kbd><kbd>w</kbd> yanks `philosophical chicken`; this is marginally better than <kbd>y</kbd><kbd>2</kbd><kbd>W</kbd> because the latter includes a trailing space
* <kbd>/</kbd>`red dog`<kbd>Enter</kbd> finds the first `red dog`
* <kbd>c</kbd><kbd>3</kbd><kbd>i</kbd><kbd>w</kbd> deletes `red dog` (again, without the trailing space) and switches to insert mode
* <kbd>Ctrl-r</kbd><kbd>0</kbd> pastes from register `0` (cf. `:h i_CTRL-R` and `:h quote0`)
* <kbd>Esc</kbd> switches to normal mode
* <kbd>n</kbd><kbd>.</kbd> finds the next `red dog` and re-plays the last operation (i.e. replaces it with `philosophical chicken`)
* repeat <kbd>n</kbd><kbd>.</kbd> as needed.

The first trick is that yanks are automatically saved to register `0`. The second trick is you can paste registers in insert mode with <kbd>Ctrl-r</kbd>.

Other things that would help you:

* turn on line numbers: `:setlocal relativenumber! number!` (run it again to turn it off)
* same thing as a macro: `nnoremap <silent> <Leader>, :setlocal relativenumber! number!<CR>`
* use line offsets relative to the cursor line: `:.,+6 s/.../.../`
* replace with confirmation: `:%s/red dog/philosophical chicken/gc`

Take a look at Drew Neil's [Vimcasts][Vimcasts] for other similar tricks. Also consider posting Vim-related questions to the [Vi site][vi.se].

[Vimcasts]: http://vimcasts.org/episodes/
[vi.se]: http://vi.stackexchange.com/