Si tengo una cadena que se ve así:
"this_is_the_string"
Dentro de un script bash, me gustaría convertirlo a PascalCase, es decir, UpperCamelCase para que se vea así:
"ThisIsTheString"
Descubrí que la conversión a lowerCamelCase se puede hacer así:
"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'
Lamentablemente, no estoy lo suficientemente familiarizado con las expresiones regulares para modificar esto.
shell-script
usuario1135541
fuente
fuente
\U\2
inserta el texto encontrado del segundo grupo, convertido a TODAS LAS MAYÚSCULAS. Compare con\u\2
, que inserta el texto en el caso Sentencia, con solo el primer carácter en mayúscula. (2) Todos los ejemplos que figuran a continuación traducirán "this_is_a_string" a "ThisIsAString", que es lo que solicitó, pero es un poco difícil de leer. Es posible que desee revisar sus requisitos para el caso especial de una palabra de una letra (subcadena). ... (Continúa)(^|_)
a(\<|_)
.Respuestas:
Sustituya el patrón
(^|_)
al comienzo de la cadena o después de un guión bajo - primer grupo([a-z])
letra minúscula individual - segundo grupoen
\U\2
mayúscula segundo grupog
globalmente.fuente
\U
es una extensión de GNU para POSIX.sed -r 's/(^|[-_ ]+)([0-9a-z])/\U\2/g'
. Así que cadenas como "this_is_2nd_string" también funcionan.Como está utilizando
bash
, si almacenó su cadena en una variable, también podría hacerlo solo con shell:${uscore//_/ }
reemplaza todo_
con espacio,(....)
divide la cadena en una matriz,${arr[@]^}
convierte la primera letra de cada elemento en mayúsculas y luegoprintf %s ..
imprime todos los elementos uno tras otro.Puede almacenar la cadena en camello en otra variable:
y usarlo / reutilizarlo más tarde, por ejemplo:
O con
zsh
:(${(s:_:)uscore})
divide la cadena_
en una matriz,(C)
escribe en mayúscula la primera letra de cada elemento eprintf %s ...
imprime todos los elementos uno tras otro.Para almacenarlo en otra variable que podría usar
(j::)
para unir los elementos:y úsalo / reutilízalo más tarde:
fuente
Aquí hay una manera de Perl:
Puede tratar cadenas de longitud arbitraria:
Coincidirá con cualquier carácter (
.
) que viene después del inicio de la cadena o un guión bajo ((^|_)
) y lo reemplazará con la versión en mayúscula de sí mismo (uc($&)
). La$&
es una variable especial que contiene lo que se acaba de comparar. Ale
final des///ge
permite el uso de expresiones (lauc()
función en este caso) dentro de la sustitución yg
hace que reemplace todas las ocurrencias en la línea. La segunda sustitución elimina los guiones bajos.fuente
perl -pe 's/(^|_)([a-z])/uc($2)/ge'
No es necesario representar la cadena completa en una coincidencia de expresión regular: sed tiene el
/g
modificador que le permite caminar sobre varias coincidencias y reemplazar cada una de ellas:La primera expresión regular es
_\([a-z]\)
: cada letra después del guión bajo; la segunda coincide con la primera letra de una cadena.fuente
Solo pongo esta respuesta porque es más corta y más simple que cualquier otra hasta ahora.
Dice: en mayúsculas, el personaje que sigue a
_
o el comienzo. No se cambiarán las letras, ya que no tienen caso.fuente
FooBar
pero el guión bajo debería eliminarse según las instrucciones. Como entiendo las instrucciones de todos modos._
) se indiquen en cambio por las transiciones de mayúsculas y minúsculas. Dado que, "FOO_BAR" → "FOOBAR" está claramente equivocado (ya que descarta la información de salto de palabra), aunque "FOO_BAR" → "FooBar" puede ser correcto. (4) Del mismo modo, un mapeo que causa colisiones parece ser contrario al espíritu de la pregunta. Por ejemplo, creo que una respuesta que convierte "DO_SPORTS" y "DOS_PORTS" al mismo objetivo es incorrecta.En perl:
Esto también es compatible con i18n:
fuente
Lo hice de esta manera:
y obtuve este resultado:
fuente