Fixed a few problems, did not test attributes. Give it a go.
(defun C:RTx (/ EN ENT NEW OLD SS STG SUB1 SUBEN TYP)
(setq OLD (getstring "\nReplace text: ")
NEW (getstring "\nNew text: ")
) ;
(setq
SS (ssget "X" (list (cons 0 "INSERT,TEXT,MTEXT,RTEXT,DTEXT,DIMENSION")))
)
(if SS
(progn
(repeat (sslength SS)
(setq ENT (ssname SS 0)
EN (entget ENT)
TYP (cdr (assoc 0 EN))
)
(if (= TYP "INSERT")
(progn
(if (assoc 66 EN)
(progn
(setq SUB1 (entnext ENT))
(while (= (cdr (assoc 0 (entget SUB1))) "ATTRIB")
(setq SUBEN (entget SUB1))
(setq STG (cdr (assoc 1 SUBEN)))
(setq STG (REPLACE OLD NEW STG))
(entmod (subst (cons 1 STG) (assoc 1 SUBEN) SUBEN))
(setq SUB1 (entnext SUB1))
)
(entupd ENT)
)
)
)
(progn
(setq STG (cdr (assoc 1 EN))
STG (REPLACE OLD NEW STG)
)
(if STG
(entmod (subst (cons 1 STG) (assoc 1 EN) EN))
)
)
)
(ssdel ENT SS)
)
)
)
) ;
(defun Replace (OLD NEW STR)
(if (and old new str)
(progn
(setq OLD (strcase OLD t))
(while (vl-string-search OLD STR)
(setq STR (vl-string-subst NEW OLD STR)) ;
) ;
(setq OLD (strcase OLD))
(while (vl-string-search OLD STR)
(setq STR (vl-string-subst NEW OLD STR)) ;
)
)
)
STR
)