如何转换传递给脚本的字符串的替代字符,如果它低于那么它应该转换为高位,如果它是高于低于??
答案 0 :(得分:0)
read -p " Enter string" str
for i in `seq 0 ${#str}`
do
#echo $i
rem=$(($i % 2 ))
if [ $rem -eq 0 ]
then
echo ${str:$i:1}
else
fr=${str:$i:1}
if [[ "$fr" =~ [A-Z] ]]
then
echo ${str:$i:1} | tr '[:upper:]' '[:lower:]'
elif [[ "$fr" =~ [a-z] ]]
then
echo ${str:$i:1} | tr '[:lower:]' '[:upper:]'
else
echo ""
fi
fi
done
答案 1 :(得分:0)
当您想要擦拭每个第二个字符的情况时,请尝试:
read -p " Enter string " str
for i in `seq 0 ${#str}`; do
rem=$(($i % 2 ))
if [ $rem -eq 0 ]
then
printf "%s" "${str:$i:1}"
else
fr=${str:$i:1}
printf "%s" "$(tr '[:upper:][:lower:]' '[:lower:][:upper:]' <<< "${str:$i:1}")"
fi
done
echo
编辑:第二个解决方案 切换str的情况并合并新旧字符串。
#!/bin/bash
str="part is lowercase & PART IS UPPERCASE"
str2=$(tr '[:upper:][:lower:]' '[:lower:][:upper:]' <<< "${str}")
str_chopped=$(sed -r 's/(.)./\1\n/g' <<< "${str}");
# Will have 1 additional char for odd length str
# str2_chopped_incorrect=$(sed -r 's/.(.)/\1\n/g' <<< "${str2}");
str2_chopped=$(fold -w2 <<< "${str2}" | sed -nr 's/.(.)/\1/p' );
paste -d '\n' <(echo "${str_chopped}") <(echo "${str2_chopped}") | tr -d '\n'; echo
答案 2 :(得分:0)
你的问题有点挑战,因为它被标记为shell
而不是像bash或zsh这样的高级shell的问题。在POSIX shell中,没有字符串索引,没有C风格的for
循环,也没有[[ .. ]]
运算符来使用字符类模式匹配。
然而,由于一些尴尬的创造力,旧的expr
和POSIX字符串和算术运算,并将您的字符串限制为ASCII字符,您可以迭代更改大写的字符串小写和小写和大写,同时保持所有其他字符不变。
如果您有可用的高级shell,我不推荐这种方法,但如果您只限制POSIX shell,因为您的问题已被标记,它会起作用,但不要指望它是超级的-fast ...
#!/bin/sh
a=${1:-"This Is My 10TH String"} ## input and output strings
b=
i=1 ## counter and string length
len=$(expr length "$a")
asciiA=$(printf "%d" "'A") ## ASCII values for A,Z,a,z
asciiZ=$(printf "%d" "'Z")
asciia=$(printf "%d" "'a")
asciiz=$(printf "%d" "'z")
echo "input : $a" ## output original string
while [ "$i" -le "$len" ]; do ## loop over each character
c=$(expr substr "$a" "$i" "1") ## extract char from string
asciic=$(printf "%d" "'$c") ## convert to ASCII value
## check if asciic is [A-Za-z]
if [ "$asciiA" -le "$asciic" -a "$asciic" -le "$asciiZ" ] ||
[ "$asciia" -le "$asciic" -a "$asciic" -le "$asciiz" ]
then ## toggle the sign bit (bit-6)
b="${b}$(printf "\x$(printf "%x" $((asciic ^ 1 << 5)))\n")"
else
b="$b$c" ## otherwise copy as is
fi
i=$(expr $i + 1)
done
echo "output: $b" ## output resluting string
案例更改受到依赖于每个大写或小写字符的ASCII值中的大小写位(位6)的简单位切换以将其从低位更改为高位或反之亦然的影响。 (请注意,您可以printf
替换tr
替换asciic
作为替代方案
示例使用/输出
$ sh togglecase.sh
input : This Is My 10TH String
output: tHIS iS mY 10th sTRING