将替代字符从低层更改为高层,从高层改为低层 - Unix shell脚本

时间:2018-05-07 08:50:45

标签: bash unix

如何转换传递给脚本的字符串的替代字符,如果它低于那么它应该转换为高位,如果它是高于低于??

3 个答案:

答案 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