Perl正则表达式非贪婪匹配

时间:2016-08-07 15:41:36

标签: regex perl

我正在将ls传递给Perl,寻找包含任何字符的行,然后是" .mp4.mp3"在行尾。我想删除" .mp4"从中间线。这是我的命令:

ls | perl -pe 's|(.+?)\.mp4\.mp3$|\1\.mp3|'

我正在使用非贪婪的匹配,因此正则表达式会在遇到" .mp4.mp3"时停止使用该行。我希望这只能在以" .mp4.mp3"结尾的行上运行,但它在没有" .mp4"的行上运行。在他们身上。

输入:foo。 bar.mp4.mp3

预期输出:foo。 bar.mp3

2 个答案:

答案 0 :(得分:3)

如果通过“在没有”.mp4“的行中操作”你的意思是你只想打印出替换发生变化的文件名,你需要不使用-p并明确打印你想要的那些:

ls | perl -wne'print if s/\.mp4\.mp3$/.mp3/'

答案 1 :(得分:1)

不要过度思考它:)

s/\.mp4\.mp3$/.mp3/

重命名Perl中的文件:

ls | perl -lne '($newname = $_ ) =~ s/\.mp4\.mp3$/.mp3/; rename($_, $newname)'