以下命令来自这个答案:https://stackoverflow.com/a/208220/3470343
该命令添加单词new.
作为前缀。这是理解的。
rename 's/(.*)$/new.$1/' original.filename
但是,我想问一下为什么这里需要开括号和右括号:
(.*)
为什么$1
是存储原始文件名的变量,为什么我不能跟随以下内容(我已将$1
替换为$2
):
rename 's/(.*)$/new.$2/' original.filename
我对bash还是比较新的,所以非常感谢帮助。
答案 0 :(得分:3)
首先,(.*)$
是所谓的正则表达式(或正则表达式)。正则表达式用于根据某些规则匹配文本。
例如,.*
匹配零个或多个字符。 $
匹配该行的结尾。因为默认情况下正则表达式是贪婪的,.*$
匹配整行(尽管正因为正则表达式是贪婪的,$
是多余的)。
但是,我想问一下为什么这里需要开括号和右括号:
(.*)
圆括号表示组。组用于“保存”匹配文本的内容,以便您以后可以使用它。
为什么
$1
是存储原始文件名的变量,为什么我不能对以下内容进行相同操作(我已将$1
替换为$2
): ...
如果是rename(1)
,则第一组存储在$1
中,第二组存储在$2
中,依此类推。例如,以下正则表达式:
(a)(b)(c)
将a
存储到$1
,将b
存储到$2
,依此类推。
您只有一个组,因此您必须使用$1
。像$2
,$3
,...等标记将为空。
最后但并非最不重要的是,您可以使用更短的等效命令:
rename 's/^/new./'
此处^
表示字符串的开头。