Converte sublinhado para PascalCase, ou seja, UpperCamelCase

23

Se eu tiver uma string parecida com esta:

"this_is_the_string"

Dentro de um script bash, eu gostaria de convertê-lo para o PascalCase, ou seja, o UpperCamelCase para ficar assim:

"ThisIsTheString"

Descobri que converter para lowerCamelCase pode ser feito assim:

"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\U\L/'

Infelizmente, não estou familiarizado o suficiente com os regexes para modificar isso.

    
por user1135541 14.04.2015 / 20:56

6 respostas

37
$ echo "this_is_the_string" | sed -r 's/(^|_)([a-z])/\U/g'            
ThisIsTheString

Substitua o padrão por (^|_) no início da sequência ou depois de um sublinhado - primeiro grupo
([a-z]) única letra minúscula - segundo grupo
por \U uppercasing second group% g globalmente.

    
por 14.04.2015 / 21:09
8

Aqui está um jeito Perl:

$ echo "this_is_the_string" | perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
ThisIsTheString

Pode lidar com sequências de comprimento arbitrário:

$ echo "here_is_another_larger_string_with_more_parts" | 
    perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
HereIsAnotherLargerStringWithMoreParts

Ele corresponderá a qualquer caractere ( . ) que venha após o início da sequência ou um sublinhado ( (^|_) ) e o substituirá pela versão em maiúscula ( uc($&) ). O $& é uma variável especial que contém o que foi correspondido. O e no final de s///ge permite o uso de expressões (a função uc() neste caso) na substituição e o g faz com que ele substitua todas as ocorrências na linha. A segunda substituição remove os sublinhados.

    
por 14.04.2015 / 21:37
6

Não é necessário representar a sequência inteira em uma correspondência de expressão regular - o sed tem o modificador /g que permite percorrer várias correspondências e substituir cada uma delas:

echo "this_is_the_string" | sed 's/_\([a-z]\)/\U/g;s/^\([a-z]\)/\U/g'

O primeiro regex é _\([a-z]\) - cada letra após sublinhado; o segundo corresponde à primeira letra de uma string.

    
por 14.04.2015 / 21:08
6

Como você está usando bash , se você armazenou sua string em uma variável, você também pode fazer isso apenas com shell:

uscore="this_is_the_string_to_be_converted"
arr=(${uscore//_/ })
printf %s "${arr[@]^}"
ThisIsTheStringToBeConverted

${uscore//_/ } substitui todo o _ pelo espaço, (....) divide a sequência em uma matriz, ${arr[@]^} converte a primeira letra de cada elemento em maiúscula e, em seguida, printf %s .. imprime todos os elementos um após o outro. br> Você pode armazenar a string de camelo em outra variável:

printf -v ccase %s "${arr[@]^}"

e use / reutilize mais tarde, por exemplo:

printf %s\n $ccase
ThisIsTheStringToBeConverted

Ou com zsh :

uscore="this_is_the_string_to_be_converted"
arr=(${(s:_:)uscore})
printf %s "${(C)arr}"
ThisIsTheStringToBeConverted

(${(s:_:)uscore}) divide a sequência em _ em uma matriz, (C) capitaliza a primeira letra de cada elemento e printf %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:

ccase=${(j::)${(C)arr}}

e use / reutilize mais tarde:

printf %s\n $ccase
ThisIsTheStringToBeConverted
    
por 15.04.2015 / 04:07
2

Eu só coloquei esta resposta porque é mais curta e mais simples do que qualquer outra até agora.

sed -re "s~(^|_)(.)~\U~g"

Ele diz: upcase, o caractere após um _ ou o início. Não letras não serão alteradas, pois não têm nenhum caso.

    
por 14.04.2015 / 23:18
1

Em perl:

$ echo 'alert_beer_core_hemp' | perl -pe 's/(?:\b|_)(\p{Ll})/\u$1/g'
AlertBeerCoreHemp

Isso também é i18n-able:

$ echo 'алерт_беер_коре_хемп' | perl -CIO -pe 's/(?:\b|_)(\p{Ll})/\u$1/g'
АлертБеерКореХемп
    
por 26.09.2018 / 23:22