There are tools which can apply a regex search-and-replace to the entire filename, e.g. perl-rename (also commonly called prename). In such tools, you would match multiple digits with \d+ or [0-9]+ inside a "capture group" (parentheses), and reference it later with $1 or \1 depending on program.
For example:
prename -v 's/file(\d+)$/file$1_xyz/' file[123]
prename -v 's/(file\d+)$/$1_xyz/' file[123]
(The -v option makes prename print out the changes. You can use -n to print changes without actually renaming anything.)
You can also achieve this using just mv and sed:
for old in file[123]; do
new=$(sed -r 's/file([0-9]+)$/file\1_xyz/' <<< "$old")
mv -v "$old" "$new"
done
But if you look closely, you don't actually need the number. All you're doing is appending some static text anyway, like this:
prename 's/$/_xyz/' file[123]
for f in file[123]; do
mv "$f" "${f}_xyz"
done