Linux重命名命令大写第一个字母

Jom*_*mpa 7 regex linux bash rename sed

我正在写一个Bash脚本来清理我的音乐.

我希望它格式化所有文件名并制作它们,所以通过一点互联网搜索,我写了这一行:

sed -i -e 's/[-_]/ /g' -e 's/ \+/ /g' -e **'s/\<[a-z]/\U&/g'** -e "s/$artist //g" -e "s/$album //g"
Run Code Online (Sandbox Code Playgroud)

我曾经将文件名添加到文本文件然后sed它,但后来我不知道如何将新名称应用于文件.

然后我开始尝试重命名并设法获得完全相同的结果,除了粗体部分,它应该使单词中的每个第一个字母大写.

rename 's/[-_]/ /g' * && rename 's/\s+/ /g' * && **rename 's/\s\w{1}/*A-Z*/g' *** && rename 's/^\d+[[:punct:]]\s//g' * && rename "s/$artist\s//g" * && rename "s/$album\s//g" * && rename "s/($ext)//g" *
Run Code Online (Sandbox Code Playgroud)

现在,重命名代码正在工作(至少令人满意),在SPACE字符后只找到一个字母,但这是有问题的替代品.我已经尝试了许多不同的方法,所有这些都让我得到的结果是,在这种情况下,焦点的第一个字母被完全交换到AZ.

在重命名手册页中,它表示使用小写大写,你可以使用/ az/AZ/g',但很容易看出它只在找到az AZ时才适用.所以这就是我需要帮助的地方.

如果有人知道如何在sed示例中执行此操作,那么\ <匹配每个单词的开头,因为此时,我的重命名命令将不适用于第一个单词,也不适用如果有多个光盘看起来像"光盘名称[光盘1]",原因很明显.

Smy*_*ers 10

这是一个Perl问题,因为它rename是用Perl编写的,有关如何执行重命名的说明是Perl命令.

s///为了使替换知道要插入大写版本的哪个字母,它必须从输入中"捕获"该字母.模式中的括号执行此操作,将捕获的字母存储在变量中$1.并且\u在替换中使下一个字符成为大写.

所以你可以这样做:

$ rename 's/\s(\w)/ \u$1/g' *
Run Code Online (Sandbox Code Playgroud)

请注意,替换部件必须在大写字母之前插入空格,因为该图案包含空格,因此空格和原始字母都被替换.您可以通过使用\b仅在字边界匹配的零宽度断言来避免这种情况:

$ rename 's/\b(\w)/\u$1/g' *
Run Code Online (Sandbox Code Playgroud)

你也不需要{1}那里,因为\w(像正则表达式中的其他符号一样)默认匹配单个字符.

最后,重命名(1)中的示例实际上是y/A-Z/a-z/使用y///运算符而不是s///.y///是一个完全不同的运算符,它将一组字母的所有出现替换为另一组; 这对你来说没什么用处,只有你想要制作大写的一些角色.


Per*_*one 4

rename -nv 's{ (\A|\s) (\w+) }{$1\u$2}xmsg'
Run Code Online (Sandbox Code Playgroud)

这将查找字符串的开头\A\s后跟至少一个或多个单词字符(az、0-9、下划线)的空格\w+。它将所有单词序列的第一个字符大写。