Suas aspas simples estão impedindo que o $ {IP} seja interpolado no valor. bash -x ajudaria (por exemplo, adicione -x a um shebang de #! / bin / bash no script)
+ substitute 10.20.30.40
+ export IP=10.20.30.40
+ IP=10.20.30.40
+ echo 10.20.30.40
10.20.30.40
+ LC_ALL=C
+ find /tmp -type f -name '*.txt' -exec sed -i.bak 's/localhost/"${IP}"/g' '{}' ';'
se você trocá-los,
+ substitute 10.20.30.40
+ export IP=10.20.30.40
+ IP=10.20.30.40
+ echo 10.20.30.40
10.20.30.40
+ LC_ALL=C
+ find /tmp -type f -name '*.txt' -exec sed -i.bak 's/localhost/'\''10.20.30.40'\''/g' '{}' ';'
a interpolação funciona. Não tenho certeza se quero citações no final, mas ...