ファイル拡張子を除いて、各ドット/ピリオドの後の最初の文字を大文字で表示するために、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
したがって、拡張子を除くすべての項目を大文字にします。
最初の文字は大文字で、拡張子は小文字で探しています。
awk
Mac 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