8

在 Bash 中是否有一种简单的方法可以将驼峰词拆分为其组成词?

例如,我想将 aCertainCamelCasedWord 拆分为“某个 Camel Cased Word”,并能够选择我感兴趣的那些字段。当单词分隔符是下划线时,这可以通过 cut(1) 轻松完成,但是当单词是驼峰式时,我该怎么做呢?

4

4 回答 4

27

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

捕获每个大写字母并将前导空格替换为整个流的捕获。

$ echo "aCertainCamelCasedWord" | sed 's/\([A-Z]\)/ \1/g'
a Certain Camel Cased Word
于 2009-03-05T14:18:01.243 回答
3

如果您不需要拆分全部大写的单词,则此解决方案有效。例如,使用您将得到的最佳答案:

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

但是,使用我的解决方案,您将得到:

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

注意:当有多个大写单词的第二个实例时,这将无法正常工作,例如:

$ echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two
于 2011-04-07T15:32:06.570 回答
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
于 2011-11-01T18:26:55.263 回答
0

纯重击:

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[@]}'"
于 2009-03-06T09:55:08.420 回答