You can create one or more templates returning the same result as the shortcodes and then do a search and replace in the db to change them one by one.
This is what I’d suggest too if you don’t want to manually modify them, though I’d generally suggest not using shortcodes within your post content so widely (sounds like you’ve come to the same conclusion
)
Worth mentioning if you didn’t already know that you can call saved templates with the [template name=my-template-slug]
shortcode, and you can pass local variables to the shortcode like so: [template name=my-template-slug post_in="195" link_text="some custom link wording]
You’d create a template that looks something like this:
<Loop type=page id="{Get local=post_in}">
<a href="{Field url}">
<If check="{Get local=link_text}"><Get local=link_text /><Else /><Field title /></If>
</a>
</Loop>
Which would loop through the post ID supplied in the shortcode with post_in and display a link that contains the link text if it exists and falls back to the page title. You may need to add a variable for the post type if ever you’re linking more than just pages. Hope this helps!
The nice thing about this approach is that if ever you need to extend the functionality of your page link shortcode or add a classname or make any other modifications, you can just modify the template.