我该如何剪切(1)camelcase单词?
-
03-07-2019 - |
题
在Bash中是否有一种简单的方法可以将一个带有字母的单词分成它的组成单词?
例如,我想将aCertainCamelCasedWord拆分为“某个Camel Cased Word”并能够选择我感兴趣的那些字段。当单词分隔符是下划线时,这可以通过cut(1)来完成,但是当单词是camelcased时我该怎么做呢?
解决方案
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
注意:当存在多个大写单词的第二个实例时,这不能正常工作,例如:
$ echo 'FAQPageOneReplacedByFAQPageTwo' | sed 's|\([A-Z][^A-Z]\)| \1|g'
FAQ Page One Replaced ByFAQ Page Two
当有答案时,此答案无效多个大写的第二个实例
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[@]}'"
不隶属于 StackOverflow