Regex Perl正则表达式非贪婪匹配

Regex Perl正则表达式非贪婪匹配,regex,perl,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不要想得太多:) 在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

不要想得太多:)

在Perl中重命名文件:

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

如果“在没有“.mp4”的行上操作”的意思是只想打印替换更改的文件名,则不需要使用-p并显式打印所需的文件名:

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

是否有任何理由不将
.mp4.mp3
替换为
.mp3
?显示示例输入以及预期和实际输出您应该始终启用警告,即使在OneLiner上也是如此。这不是一个实际的问题,但在替换的右侧使用\1而不是$1是一个错误。因为接下来是一个固定的字符串,一直到行尾,您的非贪婪匹配不会对结果产生任何影响,并且对所需时间的影响也很小。我试图最终将其导入xargs-n2 mv,就像我通常使用sed一样(但是sed不支持非贪婪,我并不需要),但是我看到-p打印每一行,不像sed p打印替换发生的行。我看到perl可以在使用-I的地方对文件进行操作,但是我在这里如何使用它呢?我的答案对您不适用吗?您也可以进行就地编辑,但如果您想使用xargs,这并没有真正的帮助。等等,您是否正在尝试打印旧名称和新名称,以便mv重命名它们?然后,如果s/^((.*)\.mp4\.mp3)$/$1\n$2.mp3/,则需要打印
。或者更好的是,只需使用rename命令而不是perl。是的,可以就地编辑或打印替换后的每一行,然后再打印替换后的行,以便将管道传输到xargs中。我会继续接受,因为我只是要求这第一部分。很好,是的,评论是我想要的。我没想过能在那里放一条新线。
ls | perl -wne'print if s/\.mp4\.mp3$/.mp3/'