我读了一本关于bash的书,书中介绍了正则表达式(我对它们还很陌生),并给出了一个例子:
rename -n 's/(.*)(.*)/new$1$2/' *
'file1' would be renamed to 'newfile1'
'file2' would be renamed to 'newfile2'
'file3' would be renamed to 'newfile3'
不幸的是,这个例子并没有提供一个详细的分类。我有点明白捕获组是什么,. * 是贪婪的,它会匹配所有字符,但我不确定为什么需要两个捕获组。另外,我知道$代表行的结尾,但我不确定$1$2在这里实际上是做什么的。感谢提供的任何见解。
试图研究捕获组和$的一些类似的例子与解释,但出现了短。
2条答案
按热度按时间11dmarpk1#
正确。
(.*)(.*)
没有意义。第二个.*
将始终匹配空字符串。例如,针对
file
进行匹配,.*
将匹配从位置0开始的4个字符的字符串(file
),并且.*
将匹配从位置4(空字符串)开始的0字符串。您可以将模式简化为
第一个
k7fdbhmy2#
我不知道
rename
命令。正则表达式看起来像sed
语法。如果是这种情况(像许多其他正则表达式形式一样),它有3个部分:s
表示替代(.*)(.*)
之间的所有内容,以指定要匹配的内容new$1$2
之间的所有内容都是替换$
仅表示正则表达式第一部分的行尾。第二部分的$
数字表示捕获组,$1
是第一组,$2
是第二组,依此类推,$0
通常是整个匹配文本。你是对的,
.*
是贪婪的,重复它是没有意义的。也许有一个\.
在中间,这是试图捕获文件名和扩展名。有更好的方法来解析文件名,如basename
。所以你可以简化命令为rename -n 's/(.*)/new$1/' *