2009-03-05 49 views
8

在Bash中是否有一种简单的方法将拼音单词分解为其组成单词?我怎样才能削减(1)驼峰的话?

例如,我想将aCertainCamelCasedWord拆分为'某种驼峰字',并能够选择那些感兴趣的字段。当单词分隔符是下划线时,使用剪切(1)可以轻松完成此操作,但是,如果单词是基于单词的,我怎么能做到这一点?

回答

27

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

捕捉每个大写字母和替代与捕获整个数据流的主要空间。

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

我爱正则表达式。 – cwallenpoole 2009-03-05 17:53:06

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

有趣,但更详细。为我说的工作使用正确的工具! ;) – 2009-03-19 15:15:07

2

我需要不分裂全部大写:

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

This answer当有多个大写

的第二个实例无法正常工作
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