2011-08-06 61 views
6

我正在弄一個shell腳本並且有一個像這樣的變量:something-that-is-hyphenatedlinux shell標題案例

我需要在腳本中使用它的不同點是:

something-that-is-hyphenatedsomethingthatishyphenatedSomethingThatIsHyphenated

我設法用sed "s/-//g"剝離出來-將其更改爲somethingthatishyphenated

我相信有一個更簡單的方法,並且還需要知道如何獲得駱駝套裝版本。

編輯:從@ Michal的答案

function hyphenToCamel { 
    tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,1,1)), substr($0,2)}' 
} 

CAMEL=$(echo something-that-is-hyphenated | hyphenToCamel) 
echo $CAMEL 

編輯派生工作功能:最後一個sed一個襯墊感謝@glenn

echo a-hyphenated-string | sed -E "s/(^|-)([a-z])/\u\2/g" 
+0

看看這個 - http://www.linuxpronews.com/linuxpronews-55-20110315ShellScriptToConvertLowercaseToTitleCase.html – arunkumar

+0

有沒有一個原因,你不能只使用相同的變量名?你爲腳本添加了很多不必要的複雜性。 –

+0

我正在構建鈦項目文件,並且需要使用my-project-name作爲應用程序名稱和項目目錄,但需要使用com.domain.myprojectname作爲應用程序ID,然後使用com.domain.myprojectname/.MyProjectNameActivity將其啓動在Android設備上的adb外殼。 –

回答

4

一個GNU sed的替換字符串中the sed manual是記錄的一行

echo something-that-is-hyphenated | 
sed -e 's/-\([a-z]\)/\u\1/g' -e 's/^[a-z]/\u&/' 

\u

+0

或者簡單地''echo a-hyphenated-string | sed -E「s /(^ | - )([a-z])/ \ u \ 2/g」'。好東西。我找不到'man sed'中記錄的功能。謝謝 - 這正是我正在尋找的。 –

+3

儘管兩者都不適用於OSX外殼 –

0

在你被卡住凌亂外殼:

 
    aa="aaa-aaa-bbb-bbb" 
    echo " $aa" | sed -e 's/--*/ /g' -e 's/ a/A/g' -e 's/ b/B/g' ... -e 's/ *//g' 

請注意回聲中的仔細放置的空間和最後-e中的雙重空間。

我把它作爲練習來完成代碼。

在Perl中它是作爲一個行shell命令更容易一點:

 
perl -e 'print map{ $a = ucfirst; $a =~ s/ +//g; $a} split(/-+/, $ARGV[0]), "\n"' $aa 
+0

如果你在bash中,請注意'$ {var // string/replacement}'。你甚至可以在純Bash中編寫CamelCase轉換代碼,雖然它會有點乏味。 – tripleee

+0

今天學到了更多。 – Gilbert

1

您可以定義一個函數:

hypenToCamel() { 
    tr '-' '\n' | awk '{printf "%s%s", toupper(substr($0,0,1)), substr($0,2)}' 
} 

CAMEL=$(echo something-that-is-hyphenated | hypenToCamel) 
echo $CAMEL 
+0

並不完全正常 - 但是讓它能夠進行一些編輯(現在加入我的問題) –

+0

只是'toupper'中的'substr',需要'substr($ 0,1,1)' –

4

純bashism:

var0=something-that-is-hyphenated 
var1=(${var0//-/ }) 
var2=${var1[*]^} 
var3=${var2// /} 
echo $var3 
SomethingThatIsHyphenated 

線1是微不足道的。
第2行是用於替換所有或's/-/ /g',包裝在parens,以建立一個數組。
3號線採用${foo^},這意味着大寫(而${foo,}將意味着「小寫」 [注,如何^點了,而,百分點]),但對每個詞的第一個字母進行操作,我們解決與${foo[*]}整個陣列(或${foo[@]},如果你願意的話)。
第4行再次是全部替換:沒有任何內容的空白。
第5行再次微不足道。

+0

整潔!借用(與適應)[這裏](http://stackoverflow.com/a/28344598/874188) – tripleee

+0

不錯,但是這缺乏一些健康的報價(因此受到路徑名稱擴展)。相反,我會建議:'var0 = something-that-is-hyphenated; IFS = - read -r -d''-a var1 <<(printf'%s \ 0'「$ {var0 ,,}」); printf'%s \ n'「$ {var1 [@] ^}」'。 –

+0

@gniourf_gniourf:你可以更具體地描述它需要引號的地方,以及它可能如何受到路徑名的擴展,可能有一個例子嗎?之後你不需要重置IFS嗎? –

0

對於記錄,這裏是一個純粹的Bash 安全方法(即不受路徑擴展) - 使用Bash≥4:

var0=something-that-is-hyphenated 
IFS=- read -r -d '' -a var1 < <(printf '%s\0' "${var0,,}") 
printf '%s' "${var1[@]^}" 

這(安全)分裂的var0小寫壯大的連字符,每個拆分部分在數組var1中。然後我們使用參數擴展^來大寫這個數組的字段的第一個字符,並將它們連接起來。

如果您的變量也可能包含空格,並且您也想對其執行操作,請將IFS=-更改爲IFS='- '