如何交替替换大写和小写?

时间:2016-12-18 19:16:19

标签: c linux shell

我正在编写一个程序,可以将大写转换为小写,小写也可以转换为大写。以下是一些例子。

  

abcde - > ABCDE

     

ABCDE - > ABCDE

     

abCdE - > ABCDE

我知道如何在c中制作它而不是shell脚本。这是c代码。

  1 #include <stdio.h>
  2 #include <ctype.h>
  3 #include <stdlib.h>
  4 #include <string.h>
  5 
  6 int main(int args, char* argv[])
  7 {
  8 
  9     if(args != 2)
 10         exit(1);
 11     char buf[100];
 12     for(int i = 0; i < strlen(argv[1]); i++)
 13     {
 14         if(i%2 == 0)
 15             buf[i] = tolower(argv[1][i]);
 16         else
 17             buf[i] = toupper(argv[1][i]);
 18     }
 19     printf("%s\n", buf);
 20 }

你们能帮助我如何用shell脚本编写它吗? 谢谢。

2 个答案:

答案 0 :(得分:2)

使用sed,您可以重复解析2个字符,将第一个更改为小写,第二个更改为大写。这看起来不错,但是带有奇数个字符的字符串的最后一个字符呢? 首先将最后一个char更改为小写。这对于奇数长度的字符串是可以的,并且将使用第二个命令修改为偶数长度的字符串:

if [ $# -ne 1 ]; then
   exit 1
fi
lastcharlow=$(sed -r "s/(.)$/\l\1/" <<< "${1}")
sed -r "s/(.)(.)/\l\1\u\2/g" <<<"${lastcharlow}"

最后两行可以合并:

sed -r "s/(.)$/\l\1/; s/(.)(.)/\l\1\u\2/g" <<<"${1}"

编辑:文字

sed解决方案很好而且简短,但没有显示如何循环字符串。当你真的不知道一个适合你的工具时,你可以遍历你的字符串。 我将展示3种用于更改char的情况的方法和用于循环字符串的两种函数。

function upper {
   # tr '[:lower:]'  '[:upper:]' <<< $1
   # echo "${1^^}"                     
   typeset -u up; up="$1"; echo "${up}" 
}                                       

function lower {
   # tr '[:upper:]'  '[:lower:]' <<< $1
   # echo "${1,,}"                     
   typeset -l low; low="$1"; echo "${low}" 
}                                          

function grepsolution {
   i=0
   while read -r onechar; do
      (( i++ ))
      if [[ $((i%2)) = 0 ]] ; then
          printf "%s" $(upper "${onechar}" )
      else
          printf "%s" $(lower "${onechar}" )
      fi
   done < <(echo $1 | grep -o .)
   printf "\n"
}

function substr_solution {
   i=0
   while [ $i -lt ${#1} ]; do
      (( i++ ))
      if [[ $((i%2)) = 0 ]] ; then
          printf "%s" $(upper "${1:i-1:1}" )
      else
          printf "%s" $(lower "${1:i-1:1}" )
      fi
   done
   printf "\n"
}

for teststring in abcde abcdef ABCDE ABCDEF; do
   echo "Converting ${teststring}"
   printf "%-20s: " "grepsolution"
   grepsolution "${teststring}"
   printf "%-20s: " "substr_solution"
   substr_solution "${teststring}"
done

答案 1 :(得分:-1)

您没有说出要使用的shell。根据外壳,这可能很复杂或容易。

例如,在Zsh中,它非常简单:

myvar="abcd"
myvar_uppercase=${(U)myvar}