linux bash camelcasing

linux bash, caja de camello para separar por guión



camelcasing (6)

¿Hay una manera de convertir algo como esto:

MyDirectoryFileLine

a

my-directory-file-line

Encontré algunas maneras de convertir todas las letras a mayúsculas o minúsculas, pero no de esa manera; ¿algunas ideas?


Con GNU sed:

echo "MyDirectoryFileLine"|sed -e ''s//([A-Z]/)/-/L/1/g''

Solo necesitas quitar el primer guión si eso te molesta:

echo "MyDirectoryFileLine"|sed -e ''s//([A-Z]/)/-/L/1/g'' -e ''s/^-//''

Con BSD sed es un poco más largo:

echo "MyDirectoryFileLine"|sed -e ''s//([A-Z]/)/-/1/g'' -e ''y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'' -e ''s/^-//''

Actualización : la versión BSD funcionará con la versión GNU, por lo que recomiendo usar esta última.


Esto podría funcionar para usted:

<<<"MyDirectoryFileLine" sed ''s/[A-Z]/-/l&/g;s/.//'' my-directory-file-line


Ninguna de las soluciones publicadas aquí funcionó para mí. La mayoría no soportaba bien las plataformas múltiples. El de @ 4ndrew estaba cerca, pero falló en los casos de borde que tenían múltiples caracteres en mayúscula uno junto al otro (ejemplo: FooMVPClient convierte en foo-mv-pclient lugar de foo-mvp-client ).

Esto funcionó para mí:

echo "MyDirectoryMVPFileLine" / | sed ''s//([a-z]/)/([A-Z]/)//1-/2/g'' / | sed ''s//([A-Z]/{2,/}/)/([A-Z]/)//1-/2/g'' / | tr ''[:upper:]'' ''[:lower:]''

salida:

my-directory-mvp-file-line


Propongo usar sed para hacer eso:

NEW=$(echo MyDirectoryFileLine / | sed ''s//(./)/([A-Z]/)//1-/2/g'' / | tr ''[:upper:]'' ''[:lower:]'')

UPD me olvido de convertir a minúsculas, código actualizado


Puede usar s//([AZ]/)/-/L/1/g para encontrar una letra mayúscula y reemplazarla con un guión y su minúscula. Sin embargo, esto le da un guión al principio de la línea, por lo que necesita otra expresión sed para manejar eso.

Esto debería funcionar:

sed --expression ''s//([A-Z]/)/-/L/1/g'' / --expression ''s/^-//'' / <<< "MyDirectoryFileLine"


echo MyDirectoryFileLine | perl -ne ''print lc(join("-", split(/(?=[A-Z])/)))''

imprime my-directory-file-line