Você pode fazer isso com rename
:
$ rename -n 's/(?<![([])(\b\w)/uc()/eg' */
dogs bark - cats miaow [DBCM001]/ -> Dogs Bark - Cats Miaow [DBCM001]/
james peach - jack beanstalk [JPJB521]/ -> James Peach - Jack Beanstalk [JPJB521]/
small pond - big fish (revive) [FIN07CD]/ -> Small Pond - Big Fish (revive) [FIN07CD]/
O -n
faz rename
imprimir o que faria sem realmente fazer nada. Remova o -n
quando tiver certeza de que funciona como você deseja.
O s/from/to/
é o operador de substituição e substituirá from
por to
. Aqui estou dando:
-
(?<![([])
: isso é chamado de lookbehind negativo . O formato geral é(?<!foo)
e significa "ignorar quaisquer correspondências se a palavra anterior forfoo
". Aqui, eu estou dando a ela o patern[([]
, essa é uma classe de caracteres (definida por[ ]
) que consiste nos caracteres:[
e(
. Então, a coisa toda significa "ignorar todas as correspondências que vêm logo depois de um[
ou um(
. -
(\b\w)
: o\b
corresponde a um "limite de palavras" . Essa é uma âncora de 0 comprimento que corresponde ao ponto de transição entre uma palavra e uma não palavra. Assim, por exemplo, corresponde no início da linha, ou em um espaço, ou em qualquer outro caractere não-palavra. O\w
, por outro lado, corresponde a um caractere de palavra. Portanto,\b\w
corresponde à primeira letra de uma palavra. Os parênteses em torno dele "capturam" para que possamos nos referir a ele comono lado direito do operador de substituição.
-
uc()
: é com isso que substituímos o que combinamos. Conforme explicado acima, como a correspondência está entre parênteses, agora podemos nos referir a ela como.
uc()
é uma função Perl que torna as coisas MAIORES. Então isso significa apenas "imprimir a partida em maiúsculas". -
eg
: essas são opções que afetam o comportamento des///
. Especificamente, oe
permite a execução de comandos no lado direito, o que nos permite usaruc()
e og
aplica a substituição globalmente a todas as correspondências na linha.
Finalmente, */
significa "executar o comando em todos os diretórios no diretório atual".
Se você também deseja colocar as palavras entre parênteses em maiúsculas, use:
$ rename -n 's/(?<!\[)(\b\w)/uc()/eg' */
dogs bark - cats miaow [DBCM001] -> Dogs Bark - Cats Miaow [DBCM001]
james peach - jack beanstalk [JPJB521] -> James Peach - Jack Beanstalk [JPJB521]
small pond - big fish (revive) [FIN07CD] -> Small Pond - Big Fish (Revive) [FIN07CD]