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

Posted

技术标签:

【中文标题】如何剪切(1)驼峰式单词?【英文标题】:How can I cut(1) camelcase words? 【发布时间】:2010-10-11 12:35:51 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

如何输出每行的单词而不是空格分隔?【参考方案2】:

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

$ 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

【讨论】:

【参考方案3】:

当有多个大写的第二个实例时,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

【讨论】:

【参考方案4】:

纯猛击:

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

【讨论】:

有趣,但更冗长。为我所说的工作使用正确的工具! ;)

以上是关于如何剪切(1)驼峰式单词?的主要内容,如果未能解决你的问题,请参考以下文章

如何在没有被剪切的单词的情况下逐个字母地将单词实例化

为啥超出单行 TextView 边界的单词不会被渲染和剪切?

Linux vim基本操作

Linux vim基本操作

PHP 很短的片段:PHP单词剪切

Linux中vim的粘贴复制快捷键的使用