我正在编写一个程序,可以将大写字母转换为小写字母,也可以将小写字母转换为大写字母。这里有些例子。
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脚本编写它吗?
谢谢。
With sed
您可以重复解析 2 个字符,将第一个字符更改为小写,将第二个字符更改为大写。这看起来不错,但是带有奇数个字符的字符串的最后一个字符怎么样?
首先将最后一个字符更改为小写。对于奇数长度的字符串来说这是可以的,对于偶数长度的字符串将使用第二个命令进行修改:
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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)