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

我正在编写一个程序,可以将大写转换为小写,小写转换为大写。 这里有些例子。

abcde – > aBcDe

ABCDE – > aBcDe

abCdE – > aBcDe

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

1 #include  2 #include  3 #include  4 #include  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脚本中编写它吗? 谢谢。

使用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 

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

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

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