Найти и заменить заглавный символ в строке и сохранить исходное соответствие - PullRequest
0 голосов
/ 20 февраля 2019

Мне нужно изменить строку «TestString» на этот формат «[tT] est [sS] tring».

Я пытался использовать sed:

testString="TestString" sed 's/\([[:upper:]]\)/[&\1]/g' <<< "$testString" | tr '[[:upper:]]' '[[:lower:]]'

Результат: [tt]est[ss]tring

Я хотел бы попросить вас о помощи, чтобы найти способ сделать второй символ в верхнем регистре скобок.

Спасибо.

1 Ответ

0 голосов
/ 20 февраля 2019

Вы можете просто использовать 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 для его запуска.

...