Вы можете просто использовать sed
для этого без необходимости использовать tr
.Приведенное ниже прекрасно работает с версией из GNU
sed -E 's/([[:upper:]])/[\L\1\u&]/g' <<< "$testString"
Чтобы понять, как это работает
s/([[:upper:]])/[\L\1\u&]/g
# ^^^^^^^^^^^ Match the uppercase character
# ^^^^ lower case the matched letter
# ^^^^ upper case the matched letter
Вы также можете сделать s/([[:upper:]])/[\L\1\u\1]/g
, поскольку оба \1
и &
относятсяв соответствующую группу из шаблона поиска.
MacOS (FreeBSD) sed по умолчанию не поддерживает функции преобразования регистра \L
, \u
.Вы можете установить его с помощью brew install gnu-sed
и вызвать gsed
для его запуска.