Xah Lee, 2008-03, 2010-10-19, 2011-02-10
This page shows you how to use emacs to do find & replace operations, and tells you how to do case-sensitive or case-insensitive match or replacement, and how to force captured regex text pattern into upper or lower case.
Here are the emacs find & replace commands. These are also under the graphical menu 〖Edit▸Replace〗.
| Command Name | keybard shortcut | Target | Purpose |
|---|---|---|---|
| query-replace | 【Alt+%】 | region, or cursor point to end | interactive find & replace |
| query-replace-regexp | 【Ctrl+Alt+%】 | region, or cusor point to end | interactive find & replace with regex pattern |
| dired-do-query-replace-regexp | In dired, Q, or menu 〖Operate▸Query Replace in Files…〗 | marked files in dired | interactive find & replace with regex pattern on multiple files |
For example, to use “query-replace”, type 【Alt+%】, then type your search string, then type your replacement string.
When a query command asks you for confirmation, type y (or Space) to do the replacement, type n to skip, type ! to do all remaining replacements without asking, type q to exit.
For tutorial on how to use “dired-do-query-replace-regexp”, see Interactively Find & Replace String Patterns on Multiple Files.
Emacs also have commands “replace-string” and “replace-regexp”. They are the non-interactive versions of “query-replace” and “query-replace-regexp”. They do all replacements in one-shot without asking confirmation for each replacement.
To make your search absolutely case-sensitive, you need to set the variable “case-fold-search” to t or nil. The menu 〖Options▸Case-Insensitive Search〗 toggles it for you.
To set variable by keyboard, type 【Alt+x set-variable】. Or, call “toggle-case-fold-search”.
To see what the current value is, call “describe-variable” 【Ctrl+h v】.
By default, the case of the replaced text is smartly dependent on the matched text. For example, suppose your search string is “here”, and your replacement string is “dragon” (and assume you are using default emacs setup so that it will match both “here”, “Here”, “HERE”). Now, when emacs found “here”, the replacement will be “dragon”, when emacs found “Here”, the replacement will be “Dragon”, when emacs found “HERE”, the replacement will be “DRAGON”.
If you want the letter case of your replacement string be exactly as you have it, you need to set the variable “case-replace” to “nil”.
If you are doing a regex search, and you want to force the replacement to upper case or lower case, you can use \,(upcase \1) or \,(downcase \1).
For example, suppose in your html code you have:
<p>once upon a time …</p> <P>There is a dragon who lived in …</P> <p>princess Tana is still waiting …</p>
You want to make sure that all paragraphs starts with a capital letter. So, you use a pattern that catches the first letter after <p>, like this <p>\([a-z]\). By default, emacs will match both <P> and <p>.
To make your captured pattern upper case, give your replacement string this
expression: <p>\,(upcase \1). The \, tells emacs that what follows should be a lisp expression. The (upcase \1) is a lisp expression. The upcase is a lisp function and the \1 means the 1st captured string in your regex pattern.
For a more complex example in using the \, in replacement, see: Regex Replace with a Function in Emacs Lisp.