将Shell中文件名或目录中每个单词的首字母大写

use*_*982 12 unix bash shell

我正在尝试编写一个shell命令,我可以在其中指定一个目录,然后内部的每个文件和目录都会将每个单词的首字母大写.所以

/doCumenTS/tesT.txt

应该改为

/DoCumenTS/TesT.txt

我想它应该开始了

for i in directory do
tr something_goes_here
done
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚的问题是如何只做第一个字母.我已经制作了一个大写整个文件名的脚本,但我无法弄清楚如何只得到每个单词的第一个字母.

谢谢!

Fri*_*ner 7

Bash 4.0+有一个参数替换'小写为大写'.要仅更改第一个字符,请使用如下:

list=( 'aaa/bbb' 'aAAA' 'aaa/bbb/ccc' 'aaa bbb/ccc' )

IFS='/'
for item in "${list[@]}"; do
  split=( $item )
  echo "'${split[*]^}'"
done
Run Code Online (Sandbox Code Playgroud)

结果:

'Aaa/Bbb'
'AAAA'
'Aaa/Bbb/Ccc'
'Aaa bbb/Ccc'
Run Code Online (Sandbox Code Playgroud)


Tod*_*obs 6

使用GNU Sed

你可以用GNU sed很容易地做到这一点.例如:

$ echo '/doCumenTS/tesT.txt' | sed 's!/.!\U&!g'
/DoCumenTS/TesT.txt
Run Code Online (Sandbox Code Playgroud)

限制

请注意,\ U转义是GNU sed扩展.手册说:

最后,作为GNU'sed'扩展,您可以包含一个由反斜杠和一个字母'L','l','U','u'或'E'组成的特殊序列.

`\U'
     Turn the replacement to uppercase until a `\L' or `\E' is found
Run Code Online (Sandbox Code Playgroud)


小智 5

Source="ONE TWO THREE FOUR"
Target="One Two Three Four"
Run Code Online (Sandbox Code Playgroud)

解决方案如下:

Target=`echo $Source | tr [A-Z] [a-z] | sed -e 's/^./\U&/g; s/ ./\U&/g'`
echo $Target

One Two Three Four
Run Code Online (Sandbox Code Playgroud)

取自这里:http://souravgulati.webs.com/apps/forums/topics/show/8584862-shell-script-capitalize-first-letter-of-every-word-of-a-line-