2016-12-18 10 views
1

大文字を小文字に変換し、小文字を大文字に変換できるプログラムを書いています。下記は用例です。このCコードをどのようにしてシェルスクリプトに変換できますか?

ABCDE - > ABCDE

ABCDE - > ABCDE

ABCDE - > ABCDE

私は、スクリプトをシェルCでそれを行うことなくする方法を知っています。ここには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 } 

あなたは私にシェルスクリプトの書き方を教えてもらえますか? ありがとうございます。

+4

あなたは 'BUF [I] =「\ 0」の文字列を終了しなかったときには、Cのコードが動作することを奇跡です。 'ループの後に。しかし、私はスコープと人生から外れてしまったので、それはうまくいきませんでした。 –

+1

シェルスクリプトでこのようにしたいと思う理由はありますか?(NULL終端文字と潜在的なバッファオーバーフローの問題を除いて)わかりやすいCコードがうまく動作するときは?私は、シェルスクリプトはこれのためのひどいツールになるという意見です。 'awk'を試してみてください。これは多くのシステムで動作し、Cのような構文をしています。 –

+0

私は@ChronoKitsuneと一緒にいる:これは、主に実際に実際に行う必要がある運動であるため、シェルスクリプトでは簡単ではありません。 Cの代わりにPerlプログラムを実行すると、 'シェルスクリプトで'カウントされますか?シェルスクリプトではどのようなコマンドを使用できますか?どちらのシェルを使用する予定ですか?たぶん大文字小文字変換機能(または 'tr'コマンド)を使用して、引数を小文字と大文字の両方に大文字と小文字(大文字と小文字の両方)に大文字と小文字に変換した後、大文字と小文字の変数。 –

答えて

1

sedを使用すると、1文字を小文字に、2文字を大文字に変更して、2文字を繰り返し解析できます。それは素晴らしいようですが、奇数の文字を持つ文字列の最後の文字はどうでしょうか?
最初に最後の文字を小文字に変更します。すなわち、奇数の長さの文字列のためのOKであり、さらに長さの文字列を2番目のコマンドで変性する:下のテキスト:

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

最後の2行は組み合わせることができる。

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

EDIT

sedのソリューションは素敵で短いですが、文字列をループする方法は示されていません。あなたが本当にあなたのために働くツールを知らないときは、あなたの文字列をループすることができます。 文字のループを行うために、charの大文字と2つの関数を変更する3つの方法を示します。

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

あなたはどのシェルを使用したいのかは言いませんでした。シェルに応じて、これは複雑で簡単です。例えば

は、Zshの中で、それは非常に簡単です:

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

これはすべての文字を大文字にします。質問では、出力の小文字と大文字を交互に表示するかどうかを尋ねます。 – 8bittree

+0

ああ、もっと慎重に読んでいたはずです。もちろんこの場合、私の反応はナンセンスです.... – user1934428

関連する問題