下線を PascalCase (例: UpperCamelCase) に変換

下線を PascalCase (例: UpperCamelCase) に変換

次の文字列がある場合:

"this_is_the_string"

Bashスクリプトでは、次のようにPascalCase、つまりUpperCamelCaseに変換したいと思います。

"ThisIsTheString"

lowerCamelCaseに変換する方法は次のとおりです。

"this_is_the_string" | sed -r 's/([a-z]+)_([a-z])([a-z]+)/\1\U\2\L\3/'

残念ながら、私は正規表現を修正するのに十分な慣れていません。

答え1

$ echo "this_is_the_string" | sed -r 's/(^|_)([a-z])/\U\2/g'            
ThisIsTheString


(^|_)文字列の先頭または下線の後(最初の
([a-z])単一小文字セット) - 2番目のグローバル
大文字セット
\U\2(2番目のセット)の後のパターンを置き換えます
g

答え2

を使用しているので、bash文字列を変数に保存すると、シェルでこれを行うこともできます。

uscore="this_is_the_string_to_be_converted"
arr=(${uscore//_/ })
printf %s "${arr[@]^}"
ThisIsTheStringToBeConverted

${uscore//_/ }_すべて空白に置き換え、(....)文字列を配列に分割し、${arr[@]^}各要素の最初の文字を大文字に変換してから、printf %s ..すべての要素を順番に印刷します。
CamelCase 文字列を他の変数に保存できます。

printf -v ccase %s "${arr[@]^}"

後で次のように使用/再使用してください。

printf %s\\n $ccase
ThisIsTheStringToBeConverted

または以下を使用してzsh

uscore="this_is_the_string_to_be_converted"
arr=(${(s:_:)uscore})
printf %s "${(C)arr}"
ThisIsTheStringToBeConverted

(${(s:_:)uscore})文字列_を配列に分割し、(C)各要素の最初の文字を大文字にし、すべての要素をprintf %s ...順番に印刷します。
別の変数に保存するには、(j::)結合要素を使用できます。

ccase=${(j::)${(C)arr}}

後で使用/再使用してください。

printf %s\\n $ccase
ThisIsTheStringToBeConverted

答え3

これがPerl方式です:

$ echo "this_is_the_string" | perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
ThisIsTheString

任意の長さの文字列を処理できます。

$ echo "here_is_another_larger_string_with_more_parts" | 
    perl -pe 's/(^|_)./uc($&)/ge;s/_//g'
HereIsAnotherLargerStringWithMoreParts

.文字列の先頭または(^|_)下線()の後のすべての文字()と一致し、それを大文字のバージョン(uc($&))に置き換えます。これは$&、一致したばかりの項目を含む特殊変数です。最後のものは、e置換に式(この場合は関数)を使用できるようにし、s///ge置き換えるようにします。uc()gみんな行で発生します。 2番目の置換は下線を削除します。

答え4

代表する必要はないみんな正規表現一致の文字列 - sedには、/g複数の一致を繰り返してそれぞれを置き換えることができる修飾子があります。

echo "this_is_the_string" | sed 's/_\([a-z]\)/\U\1/g;s/^\([a-z]\)/\U\1/g'

最初の正規表現は、_\([a-z]\)下線の後の各文字です。 2番目の正規表現は、文字列の最初の文字と一致します。

関連情報