Mac Bashの最後の文字を除いて、ファイル名から分離されたすべての「。」部分の最初の文字を大文字に変換します。

Mac Bashの最後の文字を除いて、ファイル名から分離されたすべての「。」部分の最初の文字を大文字に変換します。

ファイル拡張子を除いて、各ドット/ピリオドの後の最初の文字を大文字で表示するために、Mac Bashでファイル名を変更したいと思います。

  • 入力文字列の例:
    one.two.three.four.txt
    
  • 希望の出力:
    One.Two.Three.Four.txt
    

私は以下を試しました:

echo 'one.two.three.four.txt' | awk 'BEGIN{FS=OFS="."} NF==1{$1=toupper($1)} {for (i=1;i<NF;i++) $i=toupper($i)} 1'

しかし、結果は次のようになります。

ONE.TWO.THREE.FOUR.txt

したがって、拡張子を除くすべての項目を大文字にします。

最初の文字は大文字で、拡張子は小文字で探しています。

awkMac Bashでasを使用して解決策を見つけることはsed \U機能しません(これまでは機能しませんでした)。

事前にありがとう

答え1

試みを変形して、次のことを行う必要があります。

echo "one.two.three.four.txt" |
     awk 'BEGIN{FS=OFS="."} {for (i=1;i<NF;i++) {$i=toupper(substr($i,1,1)) substr($i,2)}}1'

これにより、入力フィールドと出力フィールドの区切り文字が再びに設定されます.

次に、最後のフィールドを除くすべてのフィールドを繰り返し、各フィールドを最初の文字の大文字バージョン(substr()分離関数を使用)と残りの元のコンテンツ(再関数を使用substr())に再組み立てします。

最後に、すべての修正を含む現在の行を印刷します(これは1ルールブロックの外側で「さまよう」ように見えます)。


付録:コメントで指摘したように、OPは実際には初期資本だけでなく成熟資本の確保も望んでいます。首都- 分離された.部分、つまり以降のすべての文字も小文字で強制します。これは上記の手順を少し変更することで達成できます。

echo "one.two.tHREE.four.txt" |
     awk 'BEGIN{FS=OFS="."} {for (i=1;i<NF;i++) {$i=toupper(substr($i,1,1)) tolower(substr($i,2))}}1'

答え2

別のPerlソリューションは、単純な正規表現を使用することです。

echo "one-one.two_two.three.four.txt"|perl -pe 's/([\w-]+\.)/ucfirst($1)/ge'
One-one.Two_two.Three.Four.txt

これは、ドット文字で区切られた単語文字セットを見つけるためにiterate()を実行します\g。このクラスで有効な文字という自動ヒントを-使用してください。これにより、各グループの最初の文字()が小文字として評価されます。\w_\e

答え3

代わりにPerlを使用できます。

$ echo "one.two.three.four.txt" | 
    perl -F'\.' -lane 'print join ".", map{ucfirst}(@F);'
One.Two.Three.Four.Txt

拡張子の最初の文字も大文字として使用したくない場合は、最後.に区切られた要素をスキップできます。

$ echo "one.two.three.four.txt" | 
    perl -F'\.' -lane 'print join( ".", map{ucfirst}(@F[0..$#F-1])) . ".$F[$#F]"'
One.Two.Three.Four.txt

答え4

次に、GNU sedをインストールします。

$ echo 'one.two.three.four.txt' | sed -E 's/([^.])([^.]*\.)/\u\1\2/g'
One.Two.Three.Four.txt

関連情報