Previous: Replacement and Case, Up: Replace


19.9.4 Query Replace

M-% string <RET> newstring <RET>
M-x query-replace <RET> string <RET> newstring <RET>
Replace some occurrences of string with newstring.
C-M-% regexp <RET> newstring <RET>
M-x query-replace-regexp <RET> regexp <RET> newstring <RET>
Replace some matches for regexp with newstring.

If you want to change only some of the occurrences of ‘foo’ to ‘bar’, not all of them, use M-% (query-replace). This command finds occurrences of ‘foo’ one by one, displays each occurrence and asks you whether to replace it. Aside from querying, query-replace works just like replace-string (see Unconditional Replace). In particular, it preserves case provided case-replace is non-nil, as it normally is (see Replacement and Case). A numeric argument means consider only occurrences that are bounded by word-delimiter characters.

C-M-% performs regexp search and replace (query-replace-regexp). It works like replace-regexp except that it queries like query-replace.

These commands highlight the current match using the face query-replace. They highlight other matches using lazy-highlight just like incremental search (see Incremental Search). By default, query-replace-regexp will show substituted replacement string for the current match in the minibuffer. If you want to keep special sequences ‘\&’ and ‘\n’ unexpanded, customize query-replace-show-replacement variable.

The characters you can type when you are shown a match for the string or regexp are:

<SPC>
to replace the occurrence with newstring.
<DEL>
to skip to the next occurrence without replacing this one.
, (Comma)
to replace this occurrence and display the result. You are then asked for another input character to say what to do next. Since the replacement has already been made, <DEL> and <SPC> are equivalent in this situation; both move to the next occurrence.

You can type C-r at this point (see below) to alter the replaced text. You can also type C-x u to undo the replacement; this exits the query-replace, so if you want to do further replacement you must use C-x <ESC> <ESC> <RET> to restart (see Repetition).

<RET>
to exit without doing any more replacements.
. (Period)
to replace this occurrence and then exit without searching for more occurrences.
!
to replace all remaining occurrences without asking again.
^
to go back to the position of the previous occurrence (or what used to be an occurrence), in case you changed it by mistake or want to reexamine it.
C-r
to enter a recursive editing level, in case the occurrence needs to be edited rather than just replaced with newstring. When you are done, exit the recursive editing level with C-M-c to proceed to the next occurrence. See Recursive Edit.
C-w
to delete the occurrence, and then enter a recursive editing level as in C-r. Use the recursive edit to insert text to replace the deleted occurrence of string. When done, exit the recursive editing level with C-M-c to proceed to the next occurrence.
e
to edit the replacement string in the minibuffer. When you exit the minibuffer by typing <RET>, the minibuffer contents replace the current occurrence of the pattern. They also become the new replacement string for any further occurrences.
C-l
to redisplay the screen. Then you must type another character to specify what to do with this occurrence.
C-h
to display a message summarizing these options. Then you must type another character to specify what to do with this occurrence.

Some other characters are aliases for the ones listed above: y, n and q are equivalent to <SPC>, <DEL> and <RET>.

Aside from this, any other character exits the query-replace, and is then reread as part of a key sequence. Thus, if you type C-k, it exits the query-replace and then kills to end of line.

To restart a query-replace once it is exited, use C-x <ESC> <ESC>, which repeats the query-replace because it used the minibuffer to read its arguments. See C-x ESC ESC.

See Operating on Files, for the Dired Q command which performs query replace on selected files. See also Transforming File Names, for Dired commands to rename, copy, or link files by replacing regexp matches in file names.