Iqb*_*akh 3 bash text-processing macos
我想将 Mac Bash 中的文件名在每个点/句点后更改为首字母大写,文件扩展名除外。
one.two.three.four.txt
Run Code Online (Sandbox Code Playgroud)
One.Two.Three.Four.txt
Run Code Online (Sandbox Code Playgroud)
我尝试了以下方法:
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
是行不通的(对我来说到目前为止还行不通)。
提前致谢
在您的尝试的变体中,应该执行以下操作:
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)
归档时间: |
|
查看次数: |
2345 次 |
最近记录: |