我正在尝试编写一个shell命令,我可以在其中指定一个目录,然后内部的每个文件和目录都会将每个单词的首字母大写。所以
/doCumenTS/tesT.txt
应该改为
/DoCumenTS/TesT.txt
我认为它应该像
一样开始for i in directory do
tr something_goes_here
done
我无法弄清楚的问题是如何只做第一个字母。我制作了一个大写整个文件名的脚本,但我无法弄清楚如何只得到每个单词的第一个字母。
谢谢!
答案 0 :(得分:7)
您可以使用GNU sed轻松完成此操作。例如:
$ echo '/doCumenTS/tesT.txt' | sed 's!/.!\U&!g'
/DoCumenTS/TesT.txt
请注意\ U转义是GNU sed扩展。手册说:
最后,作为GNU'sed'扩展,您可以包含一个由反斜杠和一个字母'L','l','U','u'或'E'组成的特殊序列。< / p>
`\U'
Turn the replacement to uppercase until a `\L' or `\E' is found
答案 1 :(得分: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
结果:
'Aaa/Bbb'
'AAAA'
'Aaa/Bbb/Ccc'
'Aaa bbb/Ccc'
答案 2 :(得分:5)
Source="ONE TWO THREE FOUR"
Target="One Two Three Four"
解决方案如下:
Target=`echo $Source | tr [A-Z] [a-z] | sed -e 's/^./\U&/g; s/ ./\U&/g'`
echo $Target
One Two Three Four
答案 3 :(得分:3)
在:
$ find . -mindepth 1 -depth -print
./file1
./bar/file3
./bar
./foo/file2
./foo/baz/file4
./foo/baz
./foo
修饰:
find . -mindepth 1 -depth -print0 |
while IFS= read -r -d '' filename; do
b=$(basename "$filename")
mv "$filename" "$(dirname "$filename")/${b^}"
done
后:
$ find . -mindepth 1 -depth -print
./Foo/Baz/File4
./Foo/Baz
./Foo/File2
./Foo
./Bar/File3
./Bar
./File1
答案 4 :(得分:2)
使用bash v4:
中的功能避免循环input='/doCumenTS/tesT.txt'
IFS='/'
dirs=( $input ) # split on '/'
output=( "${dirs[*]^}" ) # capitalize
IFS=$' \t\n' # reset IFS
您可以将其嵌入shell函数中:
capitalize_subdirs()
{
local IFS='/'
dirs=( $1 )
echo "${dirs[*]^}"
}
用法:
output=$( capitalize_subdirs '/doCumenTS/tesT.txt' )
这甚至适用于包含空格,制表符和新行的路径名称!
$ capitalize_subdirs '/doCumenTS/tesT.txt'
/DoCumenTS/TesT.txt
$ capitalize_subdirs $'/d\noCu\tme nTS/tesT.txt'
/D
oCu me nTS/TesT.txt