Se eu tiver uma string que se parece com isso:
"this_is_the_string"
Dentro de um script bash, eu gostaria de convertê-lo para PascalCase, ou seja, UpperCamelCase para ficar assim:
"ThisIsTheString"
Descobri que a conversão para lowerCamelCase pode ser feita assim:
"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'
Infelizmente, eu não estou familiarizado o suficiente com expressões regulares para modificar isso.
shell-script
user1135541
fonte
fonte
\U\2
insere o texto encontrado do segundo grupo, convertido em ALL CAPS. Compare com\u\2
, que insere o texto em maiúsculas e minúsculas, com apenas o primeiro caractere em maiúscula. (2) Todos os exemplos fornecidos abaixo traduzirão “this_is_a_string” para “ThisIsAString” - que é o que você solicitou, mas é um pouco difícil de ler. Você pode revisar seus requisitos para o caso especial de uma palavra de uma letra (substring). ... (continua)(^|_)
para(\<|_)
.Respostas:
Substitua o padrão
(^|_)
no início da sequência ou depois de um sublinhado - primeiro grupo em([a-z])
letra minúscula única - segundo grupo colocando o segundo grupoem
\U\2
maiúsculasg
globalmente.fonte
\U
é uma extensão GNU para POSIX.sed -r 's/(^|[-_ ]+)([0-9a-z])/\U\2/g'
. Então, strings como "this_is_2nd_string" também funcionam.Desde que você está usando
bash
, se você armazenou sua string em uma variável, também pode fazê-lo apenas com shell:${uscore//_/ }
substitui tudo_
pelo espaço,(....)
divide a string em uma matriz,${arr[@]^}
converte a primeira letra de cada elemento em maiúscula e depoisprintf %s ..
imprime todos os elementos um após o outro.Você pode armazenar a sequência com camelo em outra variável:
e use / reutilize mais tarde, por exemplo:
Ou, com
zsh
:(${(s:_:)uscore})
divide a string_
em uma matriz, coloca em(C)
maiúscula a primeira letra de cada elemento eprintf %s ...
imprime todos os elementos um após o outro.Para armazená-lo em outra variável, você pode usar
(j::)
para unir os elementos:e use / reutilize mais tarde:
fonte
Aqui está uma maneira Perl:
Pode lidar com cadeias de comprimento arbitrário:
Ele corresponderá a qualquer caractere (
.
) que vem após o início da string ou a um sublinhado ((^|_)
) e o substituirá pela versão em maiúscula de si mesmo (uc($&)
). O$&
é uma variável especial que contém o que foi correspondido. Oe
no final des///ge
permite o uso de expressões (auc()
função neste caso) dentro da substituição e og
faz substituir todas as ocorrências na linha. A segunda substituição remove os sublinhados.fonte
perl -pe 's/(^|_)([a-z])/uc($2)/ge'
Não é necessário representar a string inteira em uma correspondência de expressão regular - sed possui o
/g
modificador que permite percorrer várias correspondências e substituir cada uma delas:O primeiro regex é
_\([a-z]\)
- cada letra após sublinhado; o segundo corresponde à primeira letra de uma string.fonte
Eu apenas coloquei nesta resposta porque é mais curta e mais simples do que qualquer outra até agora.
Diz: maiúscula, o personagem após um
_
ou o início. As letras que não sejam não serão alteradas, pois não têm maiúsculas.fonte
FooBar
mas o sublinhado deve ser removido conforme as instruções. Pelo que entendi as instruções de qualquer maneira._
) sejam indicadas por transições de maiúsculas e minúsculas. Dado que, “FOO_BAR” → “FOOBAR” está claramente errado (pois descarta as informações de quebra de palavra), embora “FOO_BAR” → “FooBar” possa estar correto. (4) Da mesma forma, um mapeamento que causa colisões parece ser contrário ao espírito da questão. Por exemplo, acredito que uma resposta que converte "DO_SPORTS" e "DOS_PORTS" para o mesmo destino está errada.Em perl:
Isso também é capaz de i18n:
fonte
Eu fiz assim:
e obteve este resultado:
fonte