Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 小写+;大写+;在shell中连接字符串的单词(例如bash)_String_Shell_Lowercase_Capitalization_Capitalize_Bash - Fatal编程技术网

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

String 小写+;大写+;在shell中连接字符串的单词(例如bash),string,shell,lowercase,capitalization,capitalize,bash,String,Shell,Lowercase,Capitalization,Capitalize,Bash,如何大写+连接字符串中的单词? (大写首字母和所有其他小写字母) 示例: input=“詹姆斯·邦德” output=“JamesBond”在其他帖子中,我提出了以下工作脚本: str="jAMeS bOnD" res="" split=`echo $str | sed -e 's/ /\n/g'` # Split with space as delimiter for word in $split; do word=${word,,} # Lowercase word=${wo

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

示例:
input=“詹姆斯·邦德”


output=“JamesBond”

在其他帖子中,我提出了以下工作脚本:

str="jAMeS bOnD"
res=""
split=`echo $str | sed -e 's/ /\n/g'` # Split with space as delimiter
for word in $split; do
    word=${word,,} # Lowercase
    word=${word^} # Uppercase first letter
    res=$res$word # Concatenate result
done

echo $res
参考资料:


使用awk有点冗长,但可以完成以下任务:

s="jAMeS bOnD"
awk '{for (i=1; i<=NF; i++)  
   printf toupper(substr($i, 1, 1)) tolower(substr($i,2)); print ""}' <<< "$s"
JamesBond
s=“詹姆斯·邦德”

awk'{for(i=1;i在版本4中提供的字符串操作:

  • ${variable,,}
    将所有字母小写
  • ${variable^}
    到每个单词的大写首字母
  • 使用
    ${words[*]^}
    而不是
    ${words[@]^}
    保存一些脚本行
以及其他改进(见他的评论):

  • 变量名用小写,因为大写可能与环境变量冲突
  • 为变量指定有意义的名称(例如
    数组
    ->
    单词
  • 使用
    local
    避免影响功能外的
    IFS
    (一次为ENOUGHT)
  • 对所有其他局部变量使用
    local
    (可以先声明变量,然后分配变量)
  • ARRAY=($LOWERCASE)
    may展开(文件名)
    • 暂时禁用使用
      set-f
      shopt-so noglob

    • 或者使用
      read-ra words这里有一个
      bash3+
      解决方案
      利用
      tr
      进行案例转换(案例转换操作符(
      ^
      ,…)在
      bash
      4中引入):

      input=“詹姆斯·邦德”
      
      read-ra单词很好,但是GNU Awk 3.1.7说
      Awk:(FILENAME=-FNR=1)致命:printf:no arguments
      。我不得不下移
      printf
      ,下移到
      toupper…
      。干杯:)不需要使用
      sed
      命令和中间的
      $split
      变量:将带
      的无引号字符串用于
      for
      也会使用空格而不仅仅是换行符执行分词;因此,您可以只说:
      for word in$str;do
      。无论哪种方式,都有一个陷阱:带
      for
      的无引号字符串是根据路径名扩展,因此如果字符串包含一个glob,例如
      *
      ,则结果将是意外的。打开
      set-f
      shopt-so noglob
      )可以解决此问题。请注意,您的解决方案需要bash 4或更高版本。+1;方便的东西;一些建议:在shell编程中不使用所有大写变量名是一种好的做法,以避免与环境变量发生冲突(尽管我不希望看到奇妙的超现实主义
      $LOWERCASE
      go:)。使用
      数组=($LOWERCASE)
      创建word数组有一个陷阱:字符串会进行路径名扩展,因此如果字符串包含一个glob,例如
      *
      ,则结果将是意外的。打开
      set-f
      shopt-so noglob
      )可以解决此问题。另一个选项是使用
      read-a
      创建数组(请参阅我的答案)。我建议在shell函数中使用局部变量,例如:
      local IFS='
      -这还有一个额外的好处,即在离开函数时不必还原
      $IFS
      。我感谢您致力于改进答案-这些函数非常优雅。最后一个建议:我建议将函数中的所有变量都设置为局部变量。加上一个诡辩:当第二次赋值
      $IFS
      时重复
      local
      是有效的,但我只在顶部声明变量一次。例如,在第二个函数中,您可以使用
      local words IFS=$'\t\n-\';!:*?'
      (或者使用
      local
      仅声明一次,然后再赋值),然后简单地
      IFS='
      稍后。谢谢@mklement0:-D我刚刚应用了你最后的建议:-)我还缩短了答案;-)干杯请务必对你的答案做一些解释,而不仅仅是代码。谢谢你的反馈@AMACB我添加了一条评论。上面只是一个可以用来格式化字符串的示例。
      capitalize_remove_spaces()
      {
        local words IFS
        read -ra words <<< "${@,,}"
        IFS=''
        echo "${words[*]^}"
      }
      
      capitalize_remove_punctuation()
      {
        local words IFS=$' \t\n-\'.,;!:*?' #Handle hyphenated names and punctuation
        read -ra words <<< "${@,,}"
        IFS=''
        echo "${words[*]^}"
      }
      
      > 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
      
      input="jAMeS bOnD"
      
      read -ra words <<<"$input" # split input into an array of words
      output="" # initialize output variable
      for word in "${words[@]}"; do # loop over all words
        # add capitalized 1st letter
        output+="$(tr '[:lower:]' '[:upper:]' <<<"${word:0:1}")"
        # add lowercase version of rest of word
        output+="$(tr '[:upper:]' '[:lower:]' <<<"${word:1}")"
      done
      
      echo -e '\n' "!!!!! PERMISSION to WRITE in  /var/log/ DENIED !!!!!"
      echo -e '\n'
      echo "Do you want to continue?"
      echo -e '\n' "Yes or No"
      read -p "Please Respond_: " Response #get input from keyboard "yes/no"
      #Capitalizing 'yes/no' with # echo $Response | awk '{print toupper($0)}' or echo $Response | tr [a-z] [A-Z] 
      answer=$(echo $Response | awk '{print toupper($0)}') 
      case $answer in
          NO)
              echo -e '\n' "Quitting..."
              exit 1
              ;;
          YES)
              echo -e '\n' "Proceeding..."
              ;;
      esac