Perl переименовывает команду regex, работающую странно с группами и дефис

Я пытаюсь переименовать кучу файла с помощью утилиты rename perl

Мое заменяющее строковое выражение - s/(\d)(?:-|_)*([A-Z]+)(?:-|_)*(\d+[A-Z]{0,2})(?:-|_)*([A-Z]{2})/$1-$2-$3-$4/. Я не знаю много перла, поэтому не знаю, легко ли это.

Когда я пытаюсь использовать все 4 группы в качестве обратной ссылки с помощью разделителя - ($1-$2-$3-$4), Я получаю следующее:

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)

, тогда как когда я использую _ (подчеркивание) или любой другой разделитель символов (например, $1-$2-$3_$4), я получаю другой результат. Это результат, который я хотел, но с дефис. Любая идея о том, что происходит?

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)

Я просто хотел получить результат с дефисами.

1
задан 5 December 2016 в 15:45

1 ответ

Если это не FIRST-элемент в совпадении [], - указывает диапазон. Например. [-AC] соответствует -, A или C, а [A-C] соответствует A, B or C`.

0
ответ дан 23 May 2018 в 03:41

Другие вопросы по тегам:

Похожие вопросы: