Linux 重命名命令首字母大写



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

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

sed -i -e 's/[-_]/ /g' -e 's/ +/ /g' -e **'s/<[a-z]/U&/g'** -e "s/$artist //g" -e "s/$album //g"

我用来将文件名添加到文本文件然后进行sed,但是我不知道如何将新名称应用于文件。

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

rename 's/[-_]/ /g' * && rename 's/s+/ /g' * && **rename 's/sw{1}/*A-Z*/g' *** && rename 's/^d+[[:punct:]]s//g' * && rename "s/$artists//g" * && rename "s/$albums//g" * && rename "s/($ext)//g" *

现在,重命名中的代码正在工作(至少令人满意(,在 SPACE 字符后只找到一个字母,但问题是替换。我尝试了许多不同的方法,所有这些方法都给我留下了这样的结果,在这种情况下,焦点中的第一个字母被准确地交换为 A-Z。

在重命名手册页中,它说要使小写大写,您可以执行"s/a-z/A-Z/g",但很容易发现它仅在找到 a-z A-Z 时才适用。所以这就是我需要帮助的。

一个好处是,如果有人知道如何做到这一点,就像在 sed 示例中一样,其中 \<与每个单词的开头匹配,因为目前,我的重命名命令不适用于第一个单词,如果有多个光盘看起来像"光盘名称>

这是一个

Perl问题,因为rename是用Perl编写的,而如何执行重命名的说明是一个Perl命令。

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

所以你可以做到:

$ rename 's/s(w)/ u$1/g' *
请注意,替换

部件必须在大写字母之前插入一个空格,因为模式包含一个空格,因此空格和原始字母都将被替换。您可以通过使用 b 来避免这种情况,这是一个仅在单词边界处匹配的零宽度断言:

$ rename 's/b(w)/u$1/g' *

此外,您不需要其中的{1},因为默认情况下w(如正则表达式中的其他符号(匹配单个字符。

最后,rename(1( 中的示例实际上是y/A-Z/a-z/的,使用 y/// 运算符,而不是s///y/// 是一个完全不同的运算符,它将一组字母的所有出现替换为另一组字母;这在这里对您没有用,因为只有一些您希望大写的字符。

rename -nv 's{ (A|s) (w+) }{$1u$2}xmsg'

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