正则表达式 - 使用前缀/后缀

时间:2015-08-25 16:22:17

标签: regex unix batch-rename

以下命令来自这个答案:https://stackoverflow.com/a/208220/3470343

该命令添加单词new.作为前缀。这是理解的。

rename 's/(.*)$/new.$1/' original.filename

但是,我想问一下为什么这里需要开括号和右括号:

(.*)

为什么$1是存储原始文件名的变量,为什么我不能跟随以下内容(我已将$1替换为$2 ):

rename 's/(.*)$/new.$2/' original.filename

我对bash还是比较新的,所以非常感谢帮助。

1 个答案:

答案 0 :(得分:3)

首先,(.*)$是所谓的正则表达式(或正则表达式)。正则表达式用于根据某些规则匹配文本。

例如,.*匹配零个或多个字符。 $匹配该行的结尾。因为默认情况下正则表达式是贪婪的,.*$匹配整行(尽管正因为正则表达式是贪婪的,$是多余的)。

  

但是,我想问一下为什么这里需要开括号和右括号:(.*)

圆括号表示。组用于“保存”匹配文本的内容,以便您以后可以使用它。

  

为什么$1是存储原始文件名的变量,为什么我不能对以下内容进行相同操作(我已将$1替换为$2): ...

如果是rename(1),则第一组存储在$1中,第二组存储在$2中,依此类推。例如,以下正则表达式:

(a)(b)(c)

a存储到$1,将b存储到$2,依此类推。

您只有一个组,因此您必须使用$1。像$2$3,...等标记将为空。

最后但并非最不重要的是,您可以使用更短的等效命令:

 rename 's/^/new./'

此处^表示字符串的开头。