Matching () com um regex Unix / Linux

0

Eu tenho alguns arquivos com o nome

(a).1
(a).2
...
(a).100

Como muitas ferramentas de processamento não gostam muito de ( e ) no nome do arquivo, achei melhor renomeá-las para um nome diferente. Eu pesquisei por renomear arquivos e encontrei a maravilhosa ferramenta rename onde eu posso alimentar uma expressão regular. Ok, vamos tentar isto:

$ rename -v s/\(a\)/b/ \(a\).* 

(a).1 renamed as (b).1
(a).2 renamed as (b).2
(a).3 renamed as (b).3

Hmm não é o que eu esperava. Depois de um pouco de googling descobri que \( \) é um operador de agrupamento . Que tipo de sentido faz desde que eu não escapei do ( ) no comando.

Eu resolvi meu problema de renomeação usando o caractere . que corresponde a todos os tipos de valores:

rename -v s/.b./b/ \(b\).*

Esta solução não é muito legal. Então, como faço para corresponder ( e ) no Bash / Linux / Unix Regex?

    
por Pascal 25.05.2015 / 11:17

1 resposta

1

Veja o que você precisa:

find -name "(*)*" -type f | rename 's/\(|\)//g'

Ele primeiro encontra arquivos no diretório atual que correspondem ao nome descrito e renomeia-os removendo os colchetes. Você pode ver que os caracteres correspondentes (e) são substituídos por nada.

    
por 25.05.2015 / 11:50