TL;DR: Replace s_0
with s_1
, s_1
with s_2
and so on (assuming the largest number to
replace is less than 26):
s/s_\(\d\+\)/\='s_'.(nr2char(97+submatch(1)))/g
Why did I need this?
I had several pages of notes which included TikZ diagrams of finite automata each using node labels of the form $s_0, s_1, \ldots s_n$. For example:
\begin{tikzpicture}[shorten >=1pt,node distance=2cm,on grid,auto]
\node[state, initial] (s_0) {$s_0$};
\node[state, right of=s_0] (s_1) {$s_1$};
\node[state, accepting, right of=s_1] (s_2) {$s_2$};
\draw (s_0) edge node {1} (s_1);
\draw (s_1) edge node {0} (s_2);
\end{tikzpicture}
Whilst reviewing the notes, I realised that it would make more sense for the nodes to be labelled $s_a,s_b,\ldots s_z$^{1} to more clearly show how each diagram contained the nodes from prior diagrams. The node numbers were all less than 26 and so a natural mapping to each letter of the alphabet using ASCII character codes emerges. The lowercase characters start from ASCII code 97 and the uppercase characters start from ASCII code 65.
Lowercase:
a = 97
b = 98
...
z = 122
Uppercase:
A = 65
B = 66
...
Z = 90
Converting from some $n \in \{0, 1, \ldots, 25\}$ to one of these ranges can be done by addition of $n$ to the first ASCII code in the desired range (97 and 65 for lowercase and uppercase respectively). For the lowercase conversion:
0 > 97 + 0 = 97 = a
1 > 97 + 1 = 98 = b
...
25 > 97 + 25 = 122 = z
The Vim function nr2char
returns the character that the given ASCII value
represents^{2}. The command in the TL;DR section finds all patterns $s_n$ where $n$ is a
number, extracts $n$, performs the addition described above and passes the result to
nr2char
to retrieve the corresponding character. Finally, this character is
substituted in place of $n$ in the original text.

Thankfully, none large enough to reach all the way to $s_z$. ↩︎

https://renenyffenegger.ch/notes/development/vim/script/vimscript/functions/nr2char ↩︎