Here's something I threw together a while back:
(defun c:txt (/ u str cnt bstr neg ss)
(initget 1 "U L R M UN RE")
(setq u (getkword
"\n(U)pper (L)ower (M)ixed (R)everse (UN)derline (RE)move Underline: "
)
bstr ""
neg -1
cnt 1
)
(if (setq ss (ssget '((0 . "TEXT"))))
(foreach x (mapcar 'vlax-ename->vla-object
(vl-remove-if
'listp
(mapcar 'cadr
(ssnamex ss)
)
)
)
(setq str (vla-get-textstring x))
(cond
((= u "U")
(vla-put-textstring
x
(strcase str)
)
)
((= u "L")
(vla-put-textstring
x
(strcase str T)
)
)
((= u "UN")
(if (not (wcmatch (strcase str) "*%%U*"))
(vla-put-textstring
x
(strcat "%%U" (vla-get-textstring x))
)
)
)
((= u "RE")
(if (wcmatch (strcase str) "*%%U*")
(vla-put-textstring
x
(vl-string-subst "" "%%U" (vla-get-textstring x))
)
)
)
((= u "R")
(repeat (strlen str)
(setq bstr (strcat (substr str cnt 1) bstr)
cnt (1+ cnt)
)
)
(vla-put-textstring x bstr)
(setq bstr ""
cnt 1
)
)
((= u "M")
(setq cnt (strlen str))
(repeat (strlen str)
(if (minusp neg)
(setq bstr (strcat (strcase (substr str cnt 1)) bstr)
neg 1
)
(setq bstr (strcat (strcase (substr str cnt 1) T) bstr)
neg -1
)
)
(setq cnt (1- cnt))
)
(vla-put-textstring x bstr)
(setq bstr ""
cnt 1
)
)
)
)
)
(princ)
)