質問

ラクダの単語を構成単語に分割する簡単な方法はBashにありますか?

たとえば、aCertainCamelCasedWordを「特定のキャメルケースワード」に分割し、興味のあるフィールドを選択できるようにします。これは、単語の区切り文字がアンダースコアの場合にcut(1)で簡単に行われますが、単語がキャメルケースになっている場合はどうすればよいですか?

役に立ちましたか?

解決

sed 's / \([A-Z] \)/ \ 1 / g'

各大文字をキャプチャし、先頭のスペースをストリーム全体のキャプチャに置き換えます。

$ echo "aCertainCamelCasedWord" | sed 's/\([A-Z]\)/ \1/g'
a Certain Camel Cased Word

他のヒント

このソリューションは、すべて大文字の単語を分割する必要がない場合に機能します。たとえば、あなたが得るトップアンサーを使用すると:

$ echo 'FAQPage' | sed 's/\([A-Z]\)/ \1/g' 
F A Q Page

しかし、代わりに私のソリューションでは、次のものが得られます:

$ echo 'FAQPage' | sed 's/\([A-Z][^A-Z]\)/ \1/g'
FAQ Page
  

注:複数の大文字の単語の2番目のインスタンスがある場合、これは正しく機能しません。例:

$ echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two

この回答は、複数の大文字の2番目のインスタンス

echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two

したがって、そのためには追加の式が必要です

 echo 'FAQPageOneReplacedByFAQPageTwo' | sed -e 's|\([A-Z][^A-Z]\)| \1|g' -e 's|\([a-z]\)\([A-Z]\)|\1 \2|g'
 FAQ Page One Replaced By FAQ Page Two

Pure Bash:

name="aCertainCamelCasedWord"

declare -a word                                 # the word array

counter1=0                                      # count characters
counter2=0                                      # count words

while [ $counter1 -lt ${#name} ] ; do
  nextchar=${name:${counter1}:1}
  if [[ $nextchar =~ [[:upper:]] ]] ; then
    ((counter2++))
    word[${counter2}]=$nextchar
  else
    word[${counter2}]=${word[${counter2}]}$nextchar
  fi
  ((counter1++))
done

echo -e "'${word[@]}'"
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top