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

Я пытаюсь переименовать набор файла с rename утилита жемчуга

Мое выражение строки замены 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)

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

0
задан 5 December 2016 в 14:45

2 ответа

Если я считал это право, незаконные файлы (4-BRSA-248-ES_dados.txt, например), уже находятся в требуемом формате. Поэтому никакое переименование не сделано, и они не находятся в выводе. Из страницы справочника:

"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.

Например, touch foo; rename -n 's/foo/foo/' * ничего не произведет.

1
ответ дан 28 September 2019 в 02:03

Если это не ПЕРВЫЙ элемент в [], соответствие, - указывает на диапазон. Например, [-AC] соответствия -, A или C, в то время как [A-C] соответствия A, BorC'.

0
ответ дан 28 September 2019 в 02:03

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

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