2011-12-14 10 views
15

Czy istnieje sposób przekonwertować coś takiego:linux bash, camel sprawa ciąg oddzielić od myślnika

MyDirectoryFileLine 

do

my-directory-file-line 

Znalazłem kilka sposobów, aby przekształcić wszystkie litery na wielkie lub małe litery ale nie w ten sposób; jakieś pomysły?

+0

Aby przejść od przypadku do przypadku rdzenia wielbłąda, można odwołać: http://stackoverflow.com/questions/34420091/spinal-case-to-camel-case # 34420162 –

Odpowiedz

22

Można użyć s/\([A-Z]\)/-\L\1/g znaleźć wielką literę i zastąpić ją myślnikiem i małą literą. Jednak daje to kreskę na początku linii, więc potrzebujesz innego wyrażenia sed, aby to obsłużyć.

To powinno działać:

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

Użyłem czegoś takiego jak: tmp2 = 'echo $ {tmp [@],} | sed-e/\ ([A-Z] \)/- \ L \ 1/g'' – armandfp

+1

Działa tylko dla GNU sed. – 4ndrew

+1

Nie działa na OS X od razu po zainstalowaniu - zobacz wersję @ 4ndrew dla rozwiązania działającego również na OS X. – nwinkler

6

proponuję użyć sed to zrobić:

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

UPD zapomnę do konwersji na małe litery, zaktualizowany kod

+0

"Proponujesz użycie awk", ale zamiast tego użyj sed w swojej odpowiedzi? – dogbane

+0

Tylko literówka, thx – 4ndrew

+0

To jest świetne, ponieważ działa również z OS X _sed_, bez konieczności instalowania wersji gnu. – nwinkler

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

drukuje my-directory-file-line

+1

Ładne, ale czy nie jest to przesada perla? –

+1

Calling Perl tak naprawdę nie używa teraz Bash, prawda? – GreenMatt

0

Z GNU sed:

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

Wystarczy rozebrać pierwszy myślnik, czy to przeszkadza:

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

Z BSD sed it it's nieco dłużej:

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

Aktualizacja: wersja BSD będzie działać z wersją GNU, więc zaleca się używanie tego ostatniego.

0

To może pracować dla Ciebie:

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