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