使用带有来自`util-linux`的`rename`版本的正则表达式

Arc*_*s B 8 regex linux bash

我正在使用该实用程序rename来自的 GNU/Linux 发行版,util-linux我想充分利用它的正则(Perl 或 POSIX)表达式。

两个版本rename

  • “Perl”版本,带语法 rename 's/^fgh/jkl/' fgh*
  • util-linux版本中,与语法rename fgh jkl fgh*

如果第一个正则表达式的使用似乎很明显,我无法轻松访问它。但是,我对第二个感到困惑:我找不到有关可能使用的任何相关文档或示例,在这种情况下,找不到要使用的正则表达式的格式。

让我们举一个简单的例子,一个包含以下内容的目录:

foo_a1.ext
foo_a32.ext
foo_c18.ext
foo_h12.ext
Run Code Online (Sandbox Code Playgroud)

我想使用类似这两行之一的语法:

rename "foo_[a-z]([0-9]{1,2}).ext" "foo_\1.ext" *
rename "foo_[:alpha:]([:digit:]{1,2}).ext" "foo_\1.ext" *
Run Code Online (Sandbox Code Playgroud)

预期输出为:

foo_1.ext
foo_32.ext
foo_18.ext
foo_12.ext
Run Code Online (Sandbox Code Playgroud)

这当然行不通!要么我遗漏了一些明显的东西,要么没有实现的方法可以在这个工具中使用实际的正则表达式。

(请注意,我知道在 shell 解释器中使用正则表达式重命名文件的其他可能性;这个问题针对该rename工具的特定版本。)

buf*_*uff 5

这是手册页:http : //linux.die.net/man/1/rename。这非常简单:

重命名 文件...

重命名将替换第一次出现的命名指定的文件在他们的名字

我相信没有正则表达式,它只是简单的子字符串匹配。

  • 手册页使用术语“表达式”来标识要匹配的字符串。然而,没有任何迹象表明这是一个字符串文字之外的表达式。这似乎是一个不幸的命名案例。 (2认同)