使用 perl 重命名时是否有类似括号扩展的东西?

使用 perl 重命名时是否有类似括号扩展的东西?

我有数百个文件,我想删除其中的开头数字。这些文件的名称类似于以下内容:

048banana.txt  
049pear.txt     
050watermelon.txt  
051tomato.txt    
062pepper.txt  
053potato.txt 

对于这种情况,我的建议如下:

rename 's/048|049|050|051|052|053//g' *

由于我有 100 个文件需要更改,因此写出来会非常耗费精力。是否有类似于括号扩展的方法可用于完成此操作。在理想情况下,下面的命令会很好用。

rename 's\{048..053}\\g' *

答案1

perl 中最接近的对应项可能是范围运算符 ..

例如,您可以构建一个正则表达式并按如下方式使用它:

$ rename -n 'our $re; BEGIN{$re = join "|", ("048".."053")} s/^$re//' *.txt
rename(048banana.txt, banana.txt)
rename(049pear.txt, pear.txt)
rename(050watermelon.txt, watermelon.txt)
rename(051tomato.txt, tomato.txt)
rename(053potato.txt, potato.txt)

"048"和周围的引号"053"是必要的,以防止前导零被强制解释为八进制序列。

或者(可能更简单),使用 shell 的括号扩展将替换的目标限制为那些特定文件,然后替换任意 3 个前导数字:

$ rename -n 's/^\d{3}//' {048..053}*.txt
rename(048banana.txt, banana.txt)
rename(049pear.txt, pear.txt)
rename(050watermelon.txt, watermelon.txt)
rename(051tomato.txt, tomato.txt)
rename(052*.txt, *.txt)
rename(053potato.txt, potato.txt)

在任何一种情况下都不需要修饰符g,因为每个文件名只有一个替换。

请注意,shell 括号扩展将尝试重命名,052*.txt因为您显然没有带有前缀的匹配文件名052- 您可以shopt -s nullglob在运行命令之前通过设置来防止这种情况。

相关内容