2011-12-14 9 views
15

C'è un modo per convertire qualcosa di simile:linux bash, stringa caso cammello per separare dal cruscotto

MyDirectoryFileLine 

a

my-directory-file-line 

ho trovato alcuni modi per convertire tutte le lettere in maiuscolo o minuscolo ma non in quel modo; qualche idea?

+0

Per passare da caso a caso spinale cammello, è possibile fare riferimento: http://stackoverflow.com/questions/34420091/spinal-case-to-camel-case # 34420162 –

risposta

22

È possibile utilizzare s/\([A-Z]\)/-\L\1/g per trovare una lettera maiuscola e sostituirla con un trattino ed è in minuscolo. Tuttavia, questo ti dà un trattino all'inizio della riga, quindi hai bisogno di un'altra espressione sed per gestirlo.

Questo dovrebbe funzionare:

sed -e 's/\([A-Z]\)/-\L\1/g' -e 's/^-//' <<< "MyDirectoryFileLine" 
+0

ho usato qualcosa come: tmp2 = 'echo $ {tmp [@],} | sed -e 's/\ ([A-Z] \)/- \ L \ 1/g'' – armandfp

+1

Funziona solo per GNU sed. – 4ndrew

+1

Non funziona su OS X out of the box - vedi la versione di @ 4ndrew per una soluzione che funziona anche su OS X. – nwinkler

6

propongo di usare sed per farlo:

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

UPD mi dimentico di convertire in minuscolo, codice aggiornato

+0

"Proponi di usare awk" ma usi sed nella tua risposta, invece? – dogbane

+0

Solo un refuso, grazie – 4ndrew

+0

Questo è ottimo, dal momento che funziona anche con OS X _sed_, senza la necessità di installare la versione di GNU. – nwinkler

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

stampe my-directory-file-line

+1

Bello, ma non perl troppo per questo? –

+1

Chiamare Perl in realtà non sta usando Bash, vero? – GreenMatt

0

Con GNU sed:

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

Hai solo bisogno di togliere il primo trattino, se questo è ti dà fastidio:

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

Con BSD sed it it's un po 'più a lungo:

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

Aggiornamento: la versione BSD funzionerà con la versione GNU, quindi mi consiglia di utilizzare quest'ultimo.

0

Questo potrebbe funzionare per voi:

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