Bash

將文件名的所有“.”分隔部分的第一個字母轉換為大寫,Mac Bash 中的最後一個除外

  • May 13, 2022

我想在每個點/句點之後將 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

所以它使所有內容都大寫(副檔名除外)。

我正在尋找小寫的初始資本和擴展。

在 Mac Bash 中尋找awkas的解決方案是sed \U行不通的(對我來說到目前為止還不行)。

提前致謝

在您嘗試的變體中,應該執行以下操作:

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'

引用自:https://unix.stackexchange.com/questions/701219