perl 正则表达式、捕获组和美元符号

zf9nrax1  于 2022-11-24  发布在  Perl
关注(0)|答案(2)|浏览(169)

我读了一本关于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在这里实际上是做什么的。感谢提供的任何见解。
试图研究捕获组和$的一些类似的例子与解释,但出现了短。

11dmarpk

11dmarpk1#

正确。(.*)(.*)没有意义。第二个.*将始终匹配空字符串。
例如,针对file进行匹配,

  • 第一个.*将匹配从位置0开始的4个字符的字符串(file),并且
  • 第二个.*将匹配从位置4(空字符串)开始的0字符串。

您可以将模式简化为
第一个

k7fdbhmy

k7fdbhmy2#

我不知道rename命令。正则表达式看起来像sed语法。如果是这种情况(像许多其他正则表达式形式一样),它有3个部分:

  • s表示替代
  • 前两个斜杠(.*)(.*)之间的所有内容,以指定要匹配的内容
  • 第二个和第三个斜杠new$1$2之间的所有内容都是替换

$仅表示正则表达式第一部分的行尾。第二部分的$数字表示捕获组,$1是第一组,$2是第二组,依此类推,$0通常是整个匹配文本。
你是对的,.*是贪婪的,重复它是没有意义的。也许有一个\.在中间,这是试图捕获文件名和扩展名。有更好的方法来解析文件名,如basename。所以你可以简化命令为rename -n 's/(.*)/new$1/' *

相关问题