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


8

早上,

我必须处理的当前项目以前的命名方案令我感到困扰...

Base.v2.c
Base.v2a.c
Slider.v4a.h
Area.v2a.2.h

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

除了我愿意手动执行的操作以外,还有很多文件。

我知道我可以使用重命名命令立即重命名所有文件,但是我在执行该操作时遇到了问题。如果我使用类似:

rename 's/[0-9]a/.1/' *

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


那是个坏主意。通常v2a < v2 < 2.1。换句话说,版本2-alpha表示导致版本2的版本,而不是其后的版本。最好将其重命名为version 1.99或类似名称。
jpaugh

Answers:


15

您可以使用捕获组

$ 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

或者,您可以使用后

$ 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

或者,类似于后面的内容,长度为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

请注意,我使用了较短的\d而不是[0-9]。两者是等效的,但是rename是一个perl脚本,因此了解Perl兼容正则表达式(PCRE)的语法。

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

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


8

以这种方式修改命令:

rename 's/([0-9])a/$1.1/' *
  • 替换命令s/<souce>/<replacement>/将用替换字符串替换源字符串(可以是正则表达式)。
  • 捕获基团-这些包围括号源串的部分:(regexp)(string)等将被指定为连续变量的值:$1$2,等。
  • 因此,在替换字符串中,变量$1将使用其值进行扩展,在这种情况下,该变量必须与regexp匹配[0-9]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.