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]
匹配-
,A
或C
,而[A-C]
匹配A,
B or
C`。