Если у меня есть строка, которая выглядит так:
"this_is_the_string"
Внутри bash-скрипта я хотел бы преобразовать его в PascalCase, т.е. UpperCamelCase, чтобы он выглядел так:
"ThisIsTheString"
Я обнаружил, что преобразование в lowerCamelCase может быть сделано следующим образом:
"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'
К сожалению, я недостаточно знаком с регулярными выражениями, чтобы изменить это.
shell-script
user1135541
источник
источник
\U\2
вставляет найденный текст из второй группы, преобразованный во ВСЕ КАПСЫ. Сравните с\u\2
, который вставляет текст в случае предложения, только с заглавной буквы. (2) Все приведенные ниже примеры переведут «this_is_a_string» в «ThisIsAString» - это то, что вы просили, но его немного сложно прочитать. Возможно, вы захотите пересмотреть ваши требования для особого случая однобуквенного слова (подстрока). … (Продолжение)(^|_)
на(\<|_)
.Ответы:
Замените шаблон
(^|_)
в начале строки или после подчеркивания - первая группа,([a-z])
одна строчная буква - вторая группа,
\U\2
заглавная вторая группа вg
глобальном масштабе.источник
\U
это расширение GNU для POSIX.sed -r 's/(^|[-_ ]+)([0-9a-z])/\U\2/g'
. Так что строки типа this_is_2nd_string тоже работают.Поскольку вы используете
bash
, если вы сохранили свою строку в переменной, вы также можете сделать это только для оболочки:${uscore//_/ }
заменяет все_
пробелом,(....)
разбивает строку на массив,${arr[@]^}
преобразует первую букву каждого элемента в верхний регистр и затемprintf %s ..
печатает все элементы один за другим.Вы можете сохранить строку в верблюде в другую переменную:
и использовать / повторно использовать его позже, например:
Или с
zsh
:(${(s:_:)uscore})
разбивает строку на_
массив,(C)
использует первую букву каждого элемента иprintf %s ...
печатает все элементы один за другим.Чтобы сохранить ее в другой переменной, вы можете использовать ее
(j::)
для объединения элементов:и использовать / использовать его позже:
источник
Вот способ Perl:
Может иметь дело со строками произвольной длины:
Он будет соответствовать любому символу (
.
), который следует после начала строки или подчеркивания ((^|_)
), и заменит его версией самого себя (uc($&)
) в верхнем регистре . Это$&
специальная переменная, которая содержит то, что было только что сопоставлено. Вe
концеs///ge
допускается использование выражений (uc()
в данном случае функции) в подстановке, иg
она заменяет все вхождения в строке. Вторая замена удаляет подчеркивания.источник
perl -pe 's/(^|_)([a-z])/uc($2)/ge'
Нет необходимости представлять всю строку в совпадении регулярного выражения - у sed есть
/g
модификатор, который позволяет вам проходить несколько совпадений и заменять каждое из них:Первое регулярное выражение
_\([a-z]\)
- каждая буква после подчеркивания; второй соответствует первой букве в строке.источник
Я только вставил этот ответ, потому что он короче и проще, чем любой другой.
Там написано: upcase, символ, следующий за a
_
или начало. Номера букв не будут изменены, так как они не имеют регистра.источник
FooBar
но подчеркивание должно быть удалено в соответствии с инструкциями. Как я понимаю инструкции в любом случае._
суть вопроса состоит в том, чтобы преобразовать строку так, чтобы разрывы слов, обозначенные подчеркиванием ( ), вместо этого указывались с помощью переходов регистра. Учитывая, что «FOO_BAR» → «FOOBAR» явно неверно (так как он отбрасывает информацию о разрыве слова), хотя «FOO_BAR» → «FooBar» может быть правильным. (4) Точно так же отображение, которое вызывает столкновения, кажется, противоречит духу вопроса. Например, я считаю, что ответ, который преобразует «DO_SPORTS» и «DOS_PORTS» в одну цель, является неправильным.В perl:
Это также в состоянии i18n:
источник
Я сделал это так:
и получил этот результат:
источник