如何切割(1)驼峰式单词?

9

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

例如,我想将aCertainCamelCasedWord拆分为'a Certain Camel Cased Word',并能够选择我感兴趣的字段。当单词分隔符是下划线时,使用cut(1)可以轻松完成此操作,但是当单词是驼峰式时,该怎么做呢?

4个回答

28

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

该命令会捕获每个大写字母,并将前导空格替换为整个流的捕获内容。

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

如何将每行的单词输出而不是以空格分隔? - John Chen

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

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

0

纯 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[@]}'"

有趣,但更冗长。我说用正确的工具做好工作!;) - Judge Maygarden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接