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
所以它使所有內容都大寫(副檔名除外)。
我正在尋找小寫的初始資本和擴展。
在 Mac Bash 中尋找
awk
as的解決方案是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'