Perl renomear comando regex trabalhando estranhamente com grupos e hífen

0

Estou tentando renomear um monte de arquivos com o utilitário rename perl

A expressão da string de substituição é s/(\d)(?:-|_)*([A-Z]+)(?:-|_)*(\d+[A-Z]{0,2})(?:-|_)*([A-Z]{2})/$1-$2-$3-$4/ . Eu não sei muito de perl, então não sei se é uma coisa fácil.

Quando tento usar todos os 4 grupos como referência de referência usando o separador - ( $1-$2-$3-$4 ), recebo o seguinte:

rename -n 's/(\d)(?:-|_)*([A-Z]+)(?:-|_)*(\d+[A-Z]{0,2})(?:-|_)*([A-Z]{2})/$1-$2-$3-$4/' *

rename(1BI0001DES_agp.txt, 1-BI-0001D-ES_agp.txt)
rename(1CBN0001ES_agp.txt, 1-CBN-0001-ES_agp.txt)
rename(1CMO0002ES_agp.txt, 1-CMO-0002-ES_agp.txt)
rename(1FAL0002ES_agp.txt, 1-FAL-0002-ES_agp.txt)
rename(1FI0001ES_agp.txt, 1-FI-0001-ES_agp.txt)
rename(1LB0002ES_agp.txt, 1-LB-0002-ES_agp.txt)
rename(1LD0001ES_agp.txt, 1-LD-0001-ES_agp.txt)
rename(1LPB0001ES_agp.txt, 1-LPB-0001-ES_agp.txt)
rename(1NO0001ES_agp.txt, 1-NO-0001-ES_agp.txt)
rename(1NO0003ES_agp.txt, 1-NO-0003-ES_agp.txt)
rename(1RBN0003ES_agp.txt, 1-RBN-0003-ES_agp.txt)
rename(1SJ0001ES_agp.txt, 1-SJ-0001-ES_agp.txt)
rename(1SMO0003ES_agp.txt, 1-SMO-0003-ES_agp.txt)
rename(1SRN0001ES_agp.txt, 1-SRN-0001-ES_agp.txt)
rename(2NST0001ES_agp.txt, 2-NST-0001-ES_agp.txt)

Considerando que, quando eu uso o _ (sublinhado) ou qualquer outro separador de caracteres (como $1-$2-$3_$4 ), recebo um resultado diferente. Este é o resultado que eu queria, mas com hífen. Alguma ideia do que está acontecendo?

rename -n 's/(\d)(?:-|_)*([A-Z]+)(?:-|_)*(\d+[A-Z]{0,2})(?:-|_)*([A-Z]{2})/$1-$2-$3_$4/' *

rename(1BI0001DES_agp.txt, 1-BI-0001D_ES_agp.txt)
rename(1-BRSA-241-ES_dados.txt, 1-BRSA-241_ES_dados.txt)
rename(1-BRSA-280-ES_dados.txt, 1-BRSA-280_ES_dados.txt)
rename(1-BRSA-478-ES_dados.txt, 1-BRSA-478_ES_dados.txt)
rename(1-BRSA-504D-ES_dados.txt, 1-BRSA-504D_ES_dados.txt)
rename(1-BRSA-512DA-ES_dados.txt, 1-BRSA-512DA_ES_dados.txt)
rename(1-BRSA-512DB-ES_dados.txt, 1-BRSA-512DB_ES_dados.txt)
rename(1-BRSA-512D-ES_dados.txt, 1-BRSA-512D_ES_dados.txt)
rename(1CBN0001ES_agp.txt, 1-CBN-0001_ES_agp.txt)
rename(1CMO0002ES_agp.txt, 1-CMO-0002_ES_agp.txt)
rename(1FAL0002ES_agp.txt, 1-FAL-0002_ES_agp.txt)
rename(1FI0001ES_agp.txt, 1-FI-0001_ES_agp.txt)
rename(1LB0002ES_agp.txt, 1-LB-0002_ES_agp.txt)
rename(1LD0001ES_agp.txt, 1-LD-0001_ES_agp.txt)
rename(1LPB0001ES_agp.txt, 1-LPB-0001_ES_agp.txt)
rename(1NO0001ES_agp.txt, 1-NO-0001_ES_agp.txt)
rename(1NO0003ES_agp.txt, 1-NO-0003_ES_agp.txt)
rename(1RBN0003ES_agp.txt, 1-RBN-0003_ES_agp.txt)
rename(1SJ0001ES_agp.txt, 1-SJ-0001_ES_agp.txt)
rename(1SMO0003ES_agp.txt, 1-SMO-0003_ES_agp.txt)
rename(1SRN0001ES_agp.txt, 1-SRN-0001_ES_agp.txt)
rename(2NST0001ES_agp.txt, 2-NST-0001_ES_agp.txt)
rename(4-BRSA-248-ES_dados.txt, 4-BRSA-248_ES_dados.txt)
rename(4-BRSA-253-ES_dados.txt, 4-BRSA-253_ES_dados.txt)

Eu só queria meu resultado com hífens.

    
por eusoubrasileiro 02.12.2016 / 21:26

2 respostas

1

Se eu ler isso corretamente, os arquivos incorretos ( 4-BRSA-248-ES_dados.txt , por exemplo) já estão no formato requerido. Portanto, nenhum renomeamento é feito e eles não estão na saída. De the manpage :

"rename" renames the filenames supplied according to the rule specified
as the first argument.  The perlexpr argument is a Perl expression
which is expected to modify the $_ string in Perl for at least some of
the filenames specified.  If a given filename is not modified by the
expression, it will not be renamed.  If no filenames are given on the
command line, filenames will be read via standard input.

Por exemplo, touch foo; rename -n 's/foo/foo/' * não produzirá nada.

    
por muru 05.12.2016 / 13:30
0

A menos que seja o primeiro elemento em uma correspondência [] , - indica um intervalo. Por exemplo. [-AC] corresponde a - , A ou C , enquanto [A-C] corresponde a A, B or C '.

    
por waltinator 03.12.2016 / 06:31