小写+大写+连接shell中字符串的单词(例如bash)

oli*_*bre 3 string shell lowercase capitalize capitalization

如何大写+连接字符串的单词?
(首字母大写,所有其他字母小写)

例:
input = "jAMeS bOnD"
output = "JamesBond"

oli*_*bre 6

版本4中可用的字符串操作:

  • ${variable,,} 小写所有字母
  • ${variable^} 大写每个单词的第一个字母
  • 使用${words[*]^}而不是${words[@]^}保存一些脚本行

mklement0的其他改进(见他的评论):

  • 小写的变量名称,因为大写的名称可能与环境变量冲突
  • 为变量赋予有意义的名称(例如ARRAY- > words)
  • 使用local以避免影响IFS之外的功能(一次是enougth)
  • 使用local所有其他局部变量(变量可以先申报,后来分配)
  • ARRAY=( $LOWERCASE )可以扩展globs (文件名通配符)
    • 使用或暂时禁用路径名扩展set -fshopt -so noglob
    • 或使用read -ra words <<< "$input"而不是words=( $input )

终极功能:

capitalize_remove_spaces()
{
  local words IFS
  read -ra words <<< "${@,,}"
  IFS=''
  echo "${words[*]^}"
}
Run Code Online (Sandbox Code Playgroud)

如果只想保留字母数字字符,请在操作之前扩展IFS内置变量read -ra words:

capitalize_remove_punctuation()
{
  local words IFS=$' \t\n-\'.,;!:*?' #Handle hyphenated names and punctuation
  read -ra words <<< "${@,,}"
  IFS=''
  echo "${words[*]^}"
}
Run Code Online (Sandbox Code Playgroud)

例子:

> capitalize_remove_spaces 'jAMeS bOnD'
JamesBond

> capitalize_remove_spaces 'jAMeS bOnD *'
JamesBond*

> capitalize_remove_spaces 'Jean-luc GRAND-PIERRE'
Jean-lucGrand-pierre

> capitalize_remove_punctuation 'Jean-luc GRAND-PIERRE'
JeanLucGrandPierre

> capitalize_remove_punctuation 'Jean-luc GRAND-PIERRE *'
JeanLucGrandPierre
Run Code Online (Sandbox Code Playgroud)