私はぎこちない初心者なので、ご容赦ください。
目標は、すべての単語の最初の文字が大文字で残りの文字が小文字になるように、文字列の大文字と小文字を変更することです。(例を単純にするために、ここでは「単語」は厳密にアルファベット文字として定義されています。その他はすべて区切り文字と見なされます。)
次の awk コマンドを使用して、この Web サイトの別の投稿から、すべての単語の最初の文字を大文字にする良い方法を学びました。
echo 'abce efgh ijkl mnop' | awk '{for (i=1;i <= NF;i++) {sub(".",substr(toupper($i),1,1),$i)} print}'
--> Abcd Efgh Ijkl Mnop
残りの文字を小文字にするには、awk コマンドの前に tr コマンドを付けることで簡単に実行できます。
echo 'aBcD EfGh ijkl MNOP' | tr [A-Z] [a-z] | awk '{for (i=1;i <= NF;i++) {sub(".",substr(toupper($i),1,1),$i)} print}'
--> Abcd Efgh Ijkl Mnop
ただし、awk についてさらに学習するために、同様の awk コンストラクトを使用して、最初の文字を除くすべての文字を小文字に変更したいと考えました。次のように、正規表現を使用し\B[A-Za-z]+
て単語の最初の文字以外のすべての文字と一致させ、awk コマンドsubstr(tolower($i),2)
を使用して同じ文字を小文字で提供しました。
echo 'ABCD EFGH IJKL MNOP' | awk '{for (i=1;i <= NF;i++) {sub("\B[A-Za-z]+",substr(tolower($i),2),$i)} print}'
--> Abcd EFGH IJKL MNOP
最初の単語は正しく変換されていますが、残りの単語は変更されていません。残りの単語が適切に変換されなかった理由と、変換する方法を説明していただければ幸いです。