使用重命名,保留部分搜索正则表达式

swo*_*ood 8 command-line rename

早晨,

我必须处理的当前项目有一个以前困扰我的命名方案......

Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h
Run Code Online (Sandbox Code Playgroud)

有人告诉我,版本中的“a”是为了标识需要更多工作的“alpha”版本。在项目的这个阶段,我可以删除“a”并将其替换为“.1”(v2a -> v2.1)。

有很多文件,超出了我愿意手动完成的范围。

我知道我可以使用 rename 命令一次重命名所有文件,但我遇到了如何做到这一点的问题。如果我使用类似的东西:

rename 's/[0-9]a/.1/' *
Run Code Online (Sandbox Code Playgroud)

那么我将丢失版本号的最后一位数字。有没有办法让重命名(或其他命令行工具)记住用于查找文件的正则表达式的一部分?因此,'[0-9]a' 到 '[0-9].1' 会将 1a 更改为 1.1,将 4a 更改为 4.1,等等。

ter*_*don 16

您可以使用捕获组

$ rename -n 's/(\d)a/$1.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h
Run Code Online (Sandbox Code Playgroud)

或者您可以使用回顾

$ rename -n 's/(?<=\d)a/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h
Run Code Online (Sandbox Code Playgroud)

或者,类似于回顾,0 长度断言\K,这意味着“忘记所有匹配到这一点”:

$ rename -n 's/\d\Ka/.1/' *
Area.v2a.2.h -> Area.v2.1.2.h
Base.v2a.c -> Base.v2.1.c
Slider.v4a.h -> Slider.v4.1.h
Run Code Online (Sandbox Code Playgroud)

请注意,我使用了更短的\d而不是[0-9]. 两者是等价的,但是rename是一个 perl 脚本,因此了解 Perl Compatible Regular Expressions (PCRE) 的语法。

请注意,这只会更改数字的第一次出现,后跟a. 这可能是也可能不是您需要的,这取决于您的文件名。

-n品牌rename展示一下它会而无需实际做任何事情做。一旦您确认它按预期工作,请将其删除以实际更改文件名。


pa4*_*080 8

修改命令如下:

rename 's/([0-9])a/$1.1/' *
Run Code Online (Sandbox Code Playgroud)
  • 替换命令s/<souce>/<replacement>/将用替换字符串替换源字符串(可能是正则表达式)。
  • 捕获基团-这些包围括号源串的部分:(regexp)(string)等将被指定为连续变量的值:$1$2,等。
  • 因此,在替换字符串中,变量$1将以其值扩展,在这种情况下必须与 regexp 匹配[0-9]