Find and Replace
Find and Replace searches many events, tasks, and journal entries at once and rewrites their text in a single pass. Use it when a meeting moves to a new conference room, a client changes its company name, or the same typo appears across dozens of items.
To open it, choose Edit > Find and Replace… or press ⌥⇧⌘F. It opens in its own floating window that stays on top of your calendar, so you can keep working while it is open.
How Find and Replace Works
- Type the text you want to find in the Find field.
- Press Return (or click Find). BusyCal lists every matching item with the matched text highlighted.
- Type the new text in the Replace field. As you type, the results list shows a live preview of the change. See Previewing Replacements as You Type.
- Click Replace to update the selected item, or Replace All to update every item in the list.
Each result row shows the item's icon in its calendar's color, the title, the date, and an excerpt of any matching notes, location, or URL text, so you can confirm a match before changing it. Recurring items are marked with a ↻ loop badge. Double-click a result to jump to that item in your calendar and select it.
The search re-runs automatically as you adjust the find text, the filters, or the date range, as long as the inputs stay valid. If you clear the find text, or turn off every field or every kind of item, the results clear. Fill the inputs back in and click Find to run the search again.
Narrowing What You Search
The controls above the results list decide what Find and Replace looks through. Tightening them is the best way to make sure a Replace All only touches the items you intend.
- Mode is the pop-up next to the Find field. It controls how your text is matched: Contains (anywhere in the field), Whole Word, Starts With, Ends With, or Regular Expression.
- Aa turns on Match Case, which requires an exact upper and lower case match.
- In chooses between Selected Calendars (the calendars currently checked in your source list) and All Calendars (all writable calendars, including unchecked ones).
- Between sets the start and end dates of the range to search. Only items inside this range are included, which keeps a broad rename from reaching far into the past or future.
- Include chooses which kinds of items to search: Events, Tasks, Journals, and Undated tasks. A separate Completed tasks checkbox includes or skips tasks you have already finished.
- Match chooses which fields to search within each item: Title, Notes, Location, and URL. Unchecking everything except Location, for example, updates a meeting room across many events without touching titles or notes.
Previewing Replacements as You Type
Find and Replace shows you what your edit will look like before you commit to it. While the Replace field has focus and contains text, every row in the results list swaps its highlighted matches for your replacement text, shown in the accent color and underlined. The preview updates with every keystroke, so you can catch a doubled word, the wrong capitalization, or a missing space before changing a single item.
The preview does not show everything a replacement will touch. A row shows the title itself, shortened to fit on one line when it is long, but for Notes, Location, and URL it shows one excerpt around the first match in that field. Replacing still changes every match in the field, including matches outside the excerpt. When an item may contain the find text more than once, narrow the Match checkboxes to the field you care about, or double-click the row to open the item and read it in full.
To leave the preview and see the original highlighted matches again, click back in the Find field or anywhere outside the Replace field.
The preview is purely visual and never modifies your data. Use it freely to try different replacement text until the results read the way you want.
Regular Expression Mode
The first four modes match plain text. Regular Expression matches a pattern instead, which lets you find text that varies from item to item and reuse parts of what you found in the replacement. Reach for it when the change follows a rule rather than a fixed string: reordering names, reformatting dates, or wrapping something in brackets.
Choose Regular Expression from the Mode pop-up. The Find field is then read as a pattern rather than as literal text, using standard ICU regular expression syntax. Both fields switch to a monospaced font, and autocorrect, spell checking, and smart quote and dash substitution are turned off while you type, so macOS cannot rewrite the characters in your pattern. The placeholders read Pattern to find and Replacement text with $1, $2.
A few details are worth knowing before you write a pattern:
- Aa still applies. With Match Case off, the pattern matches case-insensitively.
^and$anchor to the start and end of the whole field value, such as an entire title or the entire notes text, not to individual lines. For the same reason,.does not match across a line break.- Matches that are empty, meaning zero characters long, are ignored.
Reusing Part of a Match
Put parentheses around the part of the pattern you want to keep. Those groups are numbered from left to right, and you insert one into the Replace field with a dollar sign and its number. Non-capturing groups and lookarounds, written (?:...) and (?=...), are not numbered, while a named group written (?<name>...) is numbered along with the rest.
| Token | Inserts |
|---|---|
$1 through $99 | The text captured by that numbered group. |
$& or $0 | The entire match. |
$$ | A literal dollar sign. |
Three rules cover the remaining cases:
- A group number that does not exist in the pattern, or a group that did not take part in the match, inserts nothing.
- A two-digit reference falls back to the one-digit group when the two-digit group does not exist. With a pattern that has one group,
$12means group 1 followed by a literal2. - Any other sequence starting with
$stays literal. In the other four modes,$never has a special meaning.
The live preview expands backreferences per match, so each row shows its actual final text rather than the $1 template. Check the preview before replacing.
When a Pattern Is Not Valid
While the pattern is valid, a hint under the Replace row reads: Use ( ) to capture part of a match, then $1 and $2 in the replacement.
While the pattern is not valid, the Find field gets a red outline, the same slot under the Replace row shows the error reported by the regular expression compiler next to a warning glyph, the status bar reads Invalid pattern, and the Find button is disabled. No alert appears, you can keep typing, and the error clears as soon as the pattern compiles.
Examples
Each example shows one item's text before the change, the pattern to type in Find, the text to type in Replace, and the result.
Reorder a name from Last, First to First Last. ^(.*): takes the text ahead of the colon, ([^,]+) takes the last name, and (.+)$ takes the rest of the title, so the replacement can put the two names back in the other order.
- Before:
Interview: O'Connor, Mary - Find:
^(.*): ([^,]+), (.+)$ - Replace:
$1: $3 $2 - Result:
Interview: Mary O'Connor
Anchoring the pattern to the whole title matters here. An unanchored pattern such as (\w+), (\w+) would rewrite every other comma pair in the same field as well, and it would break a name that contains an apostrophe or a space.
Reformat an ISO date in notes. \d{4} matches four digits and \d{2} matches two, so the three groups hold the year, month, and day.
- Before:
Contract ends 2026-08-27 - Find:
(\d{4})-(\d{2})-(\d{2}) - Replace:
$3.$2.$1 - Result:
Contract ends 27.08.2026
Swap the two sides of a quantity in notes. ^(.*) takes everything up to the last space, ([^ ]+)× takes the part before the multiplication sign, and (.*)$ takes the rest.
- Before:
broccoli 1.5×340 - Find:
^(.*) ([^ ]+)×(.*)$ - Replace:
$1 $3×$2 - Result:
broccoli 340×1.5
Wrap a match in brackets. $& stands for whatever the pattern matched, so you do not have to repeat the text in the replacement.
- Before:
Standup with Priya - Find:
Priya - Replace:
[$&] - Result:
Standup with [Priya]
Add a currency symbol to a number. $$ produces the literal dollar sign, and $1 follows it with the digits that were matched.
- Before:
Deposit 20 due - Find:
Deposit (\d+) - Replace:
Deposit $$$1 - Result:
Deposit $20 due
Keeping the surrounding word in the pattern anchors the match to the number you mean. A bare (\d+) would match every run of digits in the field, so a date in the same notes would pick up a dollar sign too.
Replacing Matches
Once the preview looks right, there are two ways to apply the change:
- Replace updates the currently selected row. The row then drops out of the list and the selection moves to the next match, so you can step through items one at a time.
- Replace All updates every item currently in the list.
Both buttons replace every match in every enabled field of the items they process. Replace narrows the operation to one item, not to one match, so an item whose notes contain the find text three times has all three rewritten in one step.
Replaced items animate out of the list, and the status bar keeps a running tally of how many items matched, how many were replaced, and how many were skipped or failed. The whole operation is registered as a single Find and Replace entry in the Edit menu, so ⌘-Z undoes the entire batch at once.
For a recurring item, Find and Replace edits the series itself and never detaches the occurrence you happened to select, so the change applies to the whole series. It does not overwrite an occurrence you had already edited separately. A separately edited occurrence is its own item, though, so if its text matches your search it appears as its own row in the results and is changed like any other item when you replace it.
What Find and Replace Will and Won't Change
Find and Replace only searches and edits calendars you can write to. Read-only calendars, subscribed calendars, view-only shared calendars, and holiday calendars are excluded entirely and are never modified. The ? help button at the bottom of the window is a reminder of this.
A few other things to keep in mind:
- In Contains, Whole Word, Starts With, and Ends With modes, the replacement text must be different from the find text. Regular Expression mode does not apply that rule, since a replacement template can look identical to the pattern and still produce different text. In that mode, any item whose replacement would leave its text unchanged is counted as skipped rather than replaced.
- In every mode, the Replace buttons stay disabled until a search has run and returned at least one result.
- The Replace field must contain at least one character. Find and Replace cannot delete matched text by replacing it with nothing.
- If something changes in the background after you searched, each item is re-checked at the moment it is replaced. It must still exist, must still be on a calendar you can write to, must still be allowed by the Completed tasks setting, and must still contain a match in an enabled field that the replacement would actually change. An item that fails one of those checks is counted as skipped rather than edited. The Between range and the In calendar choice are applied when the search runs, not again at replace time.
- Closing the window clears the search text and results, but keeps its size and position for next time.
See Also
- Searching, Finding, and Filtering Events - Locate events without changing them
- Smart Filters - Save reusable searches and calendar sets
- Quick Edits - Batch editing options in the Edit menu
- Keyboard Shortcuts - The full shortcut reference
