将文件名中所有以“.”分隔的部分的第一个字母转换为大写,Mac Bash 中最后一个字母除外

Iqb*_*akh 3 bash text-processing macos

我想将 Mac Bash 中的文件名在每个点/句点后更改为首字母大写,文件扩展名除外。

我尝试了以下方法:

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'
Run Code Online (Sandbox Code Playgroud)

但这会导致输出:

ONE.TWO.THREE.FOUR.txt
Run Code Online (Sandbox Code Playgroud)

所以它使所有内容都大写(扩展名除外)。

我正在寻找小写的初始资本和扩展名。

awk在 Mac Bash 中使用as寻找解决方案sed \U是行不通的(对我来说到目前为止还行不通)。

提前致谢

Adm*_*Bee 5

在您的尝试的变体中,应该执行以下操作:

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'
Run Code Online (Sandbox Code Playgroud)

这将再次将输入和输出字段分隔符设置为..

然后,它将迭代除最后一个字段之外的所有字段,并将每个字段重新组装为第一个字符的大写版本(使用该函数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'
Run Code Online (Sandbox Code Playgroud)