Perl 重命名命令正则表达式与组和连字符配合使用时出现异常

Perl 重命名命令正则表达式与组和连字符配合使用时出现异常

rename我正在尝试使用perl 实用程序重命名一堆文件

我的替换字符串表达式是s/(\d)(?:-|_)*([A-Z]+)(?:-|_)*(\d+[A-Z]{0,2})(?:-|_)*([A-Z]{2})/$1-$2-$3-$4/。我不太了解 perl,所以不知道这是否是一件容易的事。

-当我尝试使用分隔符 ( )将所有 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

如果我没看错的话,有问题的文件(4-BRSA-248-ES_dados.txt例如)已经是所需的格式。因此没有重命名,它们也不在输出中。从手册页

“rename” 根据指定的规则重命名提供的文件名
作为第一个参数。perlexpr 参数是一个 Perl 表达式
预计这将修改 Perl 中的 $_ 字符串,至少有一部分
指定的文件名。  如果给定的文件名未被修改
表达式,它将不会被重命名。  如果未提供文件名
命令行,文件名将通过标准输入读取。

例如,touch foo; rename -n 's/foo/foo/' *将不输出任何内容。

答案2

除非它是匹配中的第一个元素[],否则-表示一个范围。例如[-AC]匹配-AC,而[A-C]匹配A,B orC`。

相关内容